в чем разница между const iterator и iterator? [дубликат]
этот вопрос уже есть ответ здесь:
- В чем разница между const_iterator и неконстантный итератор в C++ в STL? 7 ответов
в чем разница между этими двумя в отношении реализации внутри STL.
в чем разница в производительности?
Я думаю, когда мы проходим вектор в "читать только мудро", мы предпочитаем const_iterator
, да?
спасибо.
3 ответа:
там нет разницы в производительности.
A
const_iterator
- Это итератор, который указывает на значение const (например,const T*
указатель); разыменование возвращает ссылку на постоянное значение (const T&
) и предотвращает изменение указанного значения: он обеспечиваетconst
-правильность.когда у вас есть ссылка const на контейнер, вы можете получить только
const_iterator
.редактировать: я упомянул " The
const_iterator
возвращает константу указатели", который не является точным, благодаря Брэндону за указание на это.Edit: для объектов COW получение неконстантного итератора (или его разыменование), вероятно, вызовет копию. (Некоторые устаревшие и теперь Запрещенные реализации
std::string
использовать корову.)
производительность мудрый нет никакой разницы. Единственная цель иметь
const_iterator
overiterator
управлять доступностью контейнера, на котором выполняется соответствующий итератор. Вы можете понять это более четко на примере:std::vector<int> integers{ 3, 4, 56, 6, 778 };
если мы должны были читать и писать элементы контейнера, мы будем использовать итератор:
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; }
Примечание: Если вы попытаетесь изменить содержимое с помощью *это во втором случае вы получите сообщение об ошибке, потому что его только для чтения.
Если у вас есть список 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