В чем разница между const_iterator и итератором?

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

Спасибо.

Ответ 1

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

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

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

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

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

Ответ 2

Производительность разумна, нет никакой разницы. Единственная цель иметь 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; }

ПРИМЕЧАНИЕ. Если вы попытаетесь изменить содержимое, используя * его во втором случае, вы получите сообщение об ошибке, поскольку оно доступно только для чтения.

Ответ 3

если у вас есть список 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