Глава 18. Классы-контейнеры_________________________________467

{

while(first != last) *result++ = *first++;

return result;

Функция copy параметризована по двум типам итераторов. Используемые в качестве параметров шаблона имена указывают, итераторы какого типа ожидаются: итератор ввода и итератор вывода. Для остальных итераторов используются имена: Forwardlterator, Bidirectionallterator И RandomAccessIterator.

Замечание

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

Так же как существуют адаптеры-контейнеры, существуют и адаптеры-итераторы. Адаптеры-итераторы, как и адаптеры-контейнеры инкапсулируют существующий итератор, чтобы обеспечить его новое поведение. Существуют три типа адаптеров-итераторов:

• Обратные итераторы (reverse iterators)

• Итераторы вставки (insert iterators)

• Итераторы неупорядоченного хранения (raw Storage iterators)

Обратные итераторы действуют в соответствии со своим названием: разворачивают направление движения итератора в контейнере в противоположную сторону. Обратные итераторы применимы только к двунаправленным итераторам и итераторам произвольного доступа. Каждый контейнер определяет обратный и константный обратный итератор применимый к его классам. Обратные итераторы основываются на прямых итераторах и объявляются аналогично:

list::iterator i; // Прямой итератор list. list::reverse iterator ri; // Обратный итератор list.

Две функции-члена, аналогичные функциям begin о и end(), определены специально для работы с обратными итераторами: rbegin() и rend о: .

for (list:: reverse iterator ri = rbeginO; ri !== rend(); ri++) ? cout « *ri « endl;

Итераторы вставки — это особая форма итераторов вывода. При выполнении операций копирования, предыдущее содержимое контейнера переписывается. Итераторы вставки вставляют новые элементы в контейнер, переме-