466_____________________Часть III. Современное программирование на C++

I/. Использование функции STL copy: копирование файла на консоль. copy(in, eof, out);

inFile.close() ;

return 0;

}

Прямой итератор содержит всю функциональность итераторов ввода-вывода, кроме того для него нет ограничений на разыменование объектов в контейнере.

Двунаправленный итератор содержит всю функциональность прямых итераторов, плюс к этому он может двигаться в обратном направлении. Для этой цели служит операция декремент —.

Итераторы произвольного доступа наименее ограничены в своих возможностях. Они обладают всей функциональностью, двунаправленных итераторов и в дополнение имеют возможность доступа к элементам контейнера с помощью индексной операции [ ].

Итераторы — прямой, двунаправленный и произвольного доступа — Moiyr быть константными итераторами. Это означает, что значение, возвращаемое операцией итератора, является ссылкой на константу, а не просто ссылкой. Таким образом константный итератор не может изменять содержимое контейнера. Итераторы вывода не являются константными, и наоборот, итераторы ввода всегда константные.

Алгоритмы STL действуют на элементы контейнеров через итераторы. Обычно алгоритмы требуют начального и конечного итераторов. Алгоритм действует на элементы начиная с того, на который указывает начальный итератор (включая этот элемент), и тем, на который указывает конечный (исключая его). Следовательно необходимо, чтобы конечный итератор был бы достижимым (reachable) для начального. Используемые обычно итераторы — это значения, возвращаемые функциями-членами контейнера begin () и end (). Функция begin () указывает на первый элемент контейнера, а функция end () — на элемент после последнего. Они возвращают двунаправленный итератор или итератор произвольного доступа в зависимости от контейнера. Итераторы произвольного доступа поддерживают только векторы и двусторонние очереди. Все остальные контейнеры поддерживают только двунаправленные итераторы. Листинг 18.17 иллюстрирует использование функций-членов begin и end. Итератор, определяемый с помощью выражения STUDENT_SET: : iterator, является двунаправленным, поскольку множества поддерживают только двунаправленные итераторы.

Каждый алгоритм STL в качестве параметра требует итератор определенного типа. Тип контейнера или тип объекта из контейнера, с которые работает алгоритм, не имеет значения. Важен только тип итератора. Следующий фрагмент определяет функцию-шаблон copy:

template <class Inputlterator, class Outputlterator> Outputlterator copy (Inputlterator first, Inputlterator last, Outputlterator result)