The Wayback Machine - https://web.archive.org/web/20120622082944/http://ru.cppreference.com:80/w/cpp/iterator
Пространства имён
Варианты
Действия

Итераторы C++

Материал из cppreference.com
< cpp


Итераторы призваны предоставлять доступ к членам контейнеров, они могут быть использованы способом, похожим на манипуляции указателями. Например, можно использовать итератор для прохода по всем элементам вектора. Есть несколько разных типов итераторов:

Итератор Описание
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