в чем разница между const iterator и iterator? [дубликат]

этот вопрос уже есть ответ здесь:

в чем разница между этими двумя относительно реализации внутри STL. в чем разница в производительности? Я думаю, когда мы пересекаем вектор в "читайте только мудро", мы предпочитаем const_iterator, да?

спасибо.

3 ответов


нет никакой разницы в производительности.

A const_iterator является итератором, который указывает на значение const (например,const T* pointer); разыменование возвращает ссылку на постоянное значение (const T&) и предотвращает изменение ссылочного значения: оно обеспечиваетconst-правильность.

когда у вас есть ссылка const на контейнер, вы можете получить только const_iterator.

редактировать: я упомянул, что"const_iterator возвращает константу указатели", что не является точным, благодаря Брэндону, указывающему на это.

Edit: для объектов COW получение неконст-итератора (или разыменование его), вероятно, вызовет копию. (Некоторые устаревшие и теперь Запрещенные реализации std::string использовать корову.)


С точки зрения производительности разницы нет. Единственная цель иметь const_iterator над iterator управление accessesibility из контейнера, в котором соответствующий итератор работает. Вы можете понять это более ясно на примере:

std::vector<int> integers{ 3, 4, 56, 6, 778 };

если мы должны были читать и писать члены контейнера, мы будем использовать iterator:

for( std::vector<int>::iterator it = integers.begin() ; it != integers.end() ; ++it )
       {*it = 4;  std::cout << *it << std::endl; }

если бы мы только читали членов контейнера integers вы можете использовать const_iterator, который не позволяет писать или изменить элементы контейнера.

for( std::vector<int>::const_iterator it = integers.begin() ; it != integers.end() ; ++it )
       { cout << *it << endl; }

Примечание: Если вы попытаетесь изменить содержимое с помощью *it во втором случае вы получите ошибку, потому что его только для чтения.


Если у вас есть список a, а затем следующие операторы

list<int>::iterator it; // declare an iterator
    list<int>::const_iterator cit; // declare an const iterator 
    it=a.begin();
    cit=a.begin();

вы можете изменить содержимое элемента в списке, используя "it", но не " cit", то есть вы можете использовать "cit" для чтения содержимого, а не для обновления элементов.

*it=*it+1;//returns no error
    *cit=*cit+1;//this will return error