в чем разница между 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