Итераторы C++
Итераторы призваны предоставлять доступ к членам контейнеров, они могут быть
использованы способом, похожим на манипуляции указателями. Например, можно использовать
итератор для прохода по всем элементам вектора. Есть несколько разных типов итераторов:
| Итератор | Описание |
|---|---|
| input_iterator (для чтения) | Читают значения с движением вперед. Могут быть инкрементированы, сравнены и разыменованы. |
| output_iterator (для записи) | Пишут значения с движением вперед. Могут быть инкрементированы и разыменованы. |
| forward_iterator (однонаправленные) | Читают или пишут значения с движением вперед. Комбинируют функциональность предыдущих двух типов с возможностью сохранять значение итератора. |
| bidirectional_iterator (двунаправленные) | Читают и пишут значения с движением вперед или назад. Похожи на однонаправленные, но их также можно инкрементировать и декрементировать. |
| random_iterator (с произвольным доступом) | Читают и пишут значения с произвольным доступом. Самые мощные итераторы, сочетающие функциональность двунаправленных итераторов и возможность выполнения арифметики указателей и сравнений указателей. |
| reverse_iterator (обратные) | Или итераторы с произвольным доступом, или двунаправленные, движущиеся в обратном направлении. |
Каждый класс контейнеров связан с типом итератора, и каждый из алгоритмов STL использует определенный тип итератора.
Например, векторы связаны с итераторами с произвольным доступом, значит, они могут использовать алгоритмы, требующие произвольного доступа. Так как итераторы с произвольным доступом включают в себя все свойства других итераторов, то векторы также могут использовать алгоритмы, написанные для других итераторов.
Код в примере создает итератор и использует его в векторе:
vector<int> the_vector; vector<int>::iterator the_iterator; for( int i=0; i < 10; i++ ) the_vector.push_back(i); int total = 0; the_iterator = the_vector.begin(); while( the_iterator != the_vector.end() ) { total += *the_iterator; ++the_iterator; } cout << "Итого=" << total << endl;
Заметьте, что можно получить доступ к элементам контейнера путем разыменования итератора.
[править] Аннулирование Итераторов
Итераторы для существующих элементов в контейнере может стать недействительным, при изменении контейнера. Это делает изменение контейнера при итерациях проблематичной. Контейнеры предлагают различные гарантии в этой связи:
vectors: вставка / удаление может аннулировать все итераторы.
list/map: удаление делает недействительными только итераторы на удаленный элемент(ы), но не на другие элементы.
Смотри также: http:www.oreillynet.com/pub/a/network/2005/10/18/what-is-iterator-in-c-plus-plus.html

