В чем разница между этими двумя аспектами реализации внутри STL. Какая разница в производительности? Думаю, когда он только читается, мы предпочитаем const_iterator. не так ли?
Спасибо.
В чем разница между этими двумя аспектами реализации внутри STL. Какая разница в производительности? Думаю, когда он только читается, мы предпочитаем const_iterator. не так ли?
Спасибо.
Нет разницы в производительности.
A const_iterator
- это итератор, который указывает на значение const (например, указатель const T*
); разыменовывая это, возвращается ссылка на постоянное значение (const T&
) и предотвращает изменение ссылочного значения: оно обеспечивает const
-correctness.
Если у вас есть ссылка const на контейнер, вы можете получить только const_iterator
.
Отредактировано: Я упоминал "const_iterator
возвращает постоянные указатели", что неточно, благодаря Брэндону, указав его.
Изменить:. Для объектов COW получение неконтинентального итератора (или разыменование его), вероятно, вызовет копирование. (Некоторые устаревшие и теперь запрещенные реализации std::string
используют COW.)
Производительность разумна, нет никакой разницы. Единственная цель иметь 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