Здавалка
Главная | Обратная связь

Детальный анализ итератора.



Итак, пришла пора познакомиться поближе.

Итератор - это своеобразный указатель общего назначения. На самом деле простые указатели являются частным случаем итераторов, позволяющих работать с различными данными универсальным способом. Любая функция, принимая в качестве параметров итераторы, при их обработке не задумывается о типе переменных, на которые эти итераторы указывают. Итераторы позволяют получить доступ к содержимому контейнера так же, как указатели используются для доступа к элементам массива. Для использования итераторов необходимо подключить библиотеку <iterator>.

Рассмотрим типы итераторов и назначение каждого из них:

Типы итераторов.

  • Входные (input) - служат для чтения адресуемых данных. Поддерживают операции равенства, разыменования и инкремента. ==, !=, *i, ++i, i++, *i++.
  • Выходные (output) - адресуют объекты, в которые данные должны быть записаны. Поддерживают операции разыменования, допустимые только с левой стороны присваивания, и инкремента. ++i, i++, *i = t, *i++ = t.
  • Однонаправленные (forward) - обладают всеми свойствами входных и выходных, а также могут перемещаться от начала последовательности адресуемых данных в конец. Поддерживают все операции итераторов ввода/вывода и, кроме того, позволяют без ограничения применять присваивание. ==, !=, =, *i, ++i, i++, *i++.
  • Двунаправленные (bidirectional) - обладают свойствами однонаправленных, но и способны перемещаться в любом направлении по цепочке данных: как вперед, так и назад. Имеют дополнительную операцию декремента (--i, i--, *i--).
  • Итераторы произвольного доступа (random access) - обладают функциональностью всех четырех других итераторов. Поддерживают операции сравнения и адресной арифметики, то есть непосредственный доступ по индексу. i += n, i + n, i -= n, i - n, i1 - i2, i[n], i1 < i2, i1 <= i2, i1 > i2, i1 >= i2.

Примечание:Кстати, указатели языка С++ также являются итераторами произвольного доступа.

Хотим обратить Ваше внимание, что вышеописанная классификация не является строгой. Как правило, итераторы, которые обладают более расширенными свойствами, можно легко применять вместо итераторов более узкой направленности. Например, вместо итератора ввода может быть использован прямой итератор.

Кроме того, библиотека STL содержит так называемые обратные итераторы (reverse iterator). Такие итераторы бывают либо двунаправленными, либо представляются итераторами произвольного доступа. В любом проявлении, они должны обладать свойством перемещения по контейнеру в обратном направлении. То есть, если подобный итератор указывает на хвост некой последовательности, то его увеличение приведет к позиционированию на предыдущий элемент.

И, наконец, есть еще два типа итераторов, которые не вошли в основную классификацию, а именно:

Потоковые итераторы - итераторы, позволяющие перемещаться по потоку.

Итераторы вставки - итераторы, упрощающие вставку элементов в определённый контейнер.

Из всего вышесказанного, вполне очевидно, что мир итераторов достаточно широк. В процессе изучения STL, мы с Вами будем знакомиться с итераторами всех классификаций, для совершенно разных стандартных классов. Однако, у всех итераторов достаточно много общего, и дело не только в их предназначении, но и в работе с ними. Рассмотрим две функции, которые используются для работы с итераторами:







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.