С++ для начинающих




Итераторы


Итератор предоставляет обобщенный способ перебора элементов любого контейнера– как последовательного, так и ассоциативного. Пусть iter является итератором для какого-либо контейнера. Тогда

++iter;

перемещает итератор так, что он указывает на следующий элемент контейнера, а

*iter;

разыменовывает итератор, возвращая элемент, на который он указывает.

Все контейнеры имеют функции-члены begin() и end().

  • begin() возвращает итератор, указывающий на первый элемент контейнера.
  • end() возвращает итератор, указывающий на элемент, следующий за последним в контейнере.
  • Чтобы перебрать все элементы контейнера, нужно написать:

    for ( iter = container. begin();

          iter != container.end(); ++iter )

        do_something_with_element( *iter );

    Объявление итератора выглядит слишком сложным. Вот определение пары итераторов вектора типа string:

    // vector<string> vec;

    vector<string>::iterator iter = vec.begin();

    vector<string>::iterator iter_end = vec.end();

    В классе vector для определения iterator используется typedef. Синтаксис

    vector<string>::iterator

    ссылается на iterator, определенный с помощью typedef внутри класса vector, содержащего элементы типа string.

    Для того чтобы напечатать все элементы вектора, нужно написать:

    for( ; iter != iter_end; ++iter )

        cout << *iter << '\n';

    Здесь значением *iter выражения является, конечно, элемент вектора.

    В дополнение к типу iterator в каждом контейнере определен тип const_iterator, который необходим для навигации по контейнеру, объявленному как const. const_iterator позволяет только читать элементы контейнера:

    #include <vector>

    void even_odd( const vector<int> *pvec,

                   vector<int> *pvec_even,

                   vector<int> *pvec_odd )

    {

        // const_iterator необходим для навигации по pvec

        vector<int>::const_iterator c_iter = pvec->begin();

        vector<int>::const_1terator c_iter_end = pvec->end();

        for ( ; c_iter != c_iter_end; ++c_iter )




    Содержание  Назад  Вперед