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


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

  • В чем разница между const_iterator и неконстантный итератор в C++ в STL? 7 ответов

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

спасибо.

3 107

3 ответа:

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

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

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

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

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

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

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