Язык программирования C++. Вводный курс


Итераторы


Итератор предоставляет обобщенный способ перебора элементов любого контейнера– как последовательного, так и ассоциативного. Пусть 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 )

        if ( *c_iter % 2 )

            pvec_even->push_back( *c_iter );

        else pvec_odd->push_back( *c_iter );

<


Начало  Назад  Вперед



Книжный магазин