12.4.4. Итератор istream_iterator

12.4.4. Итератор istream_iterator

В общем виде объявление потокового итератора чтения istream_iterator имеет форму

istream_iterator identifier( istream& );1.

Если имеющийся у Вас компилятор пока не поддерживает параметр шаблонов по умолчанию, то конструктору istream_iterator необходимо будет явно передать также и второй аргумент: тип difference_type, способный хранить результат вычитания двух итераторов контейнера, куда помещаются элементы. Например, в разделе 12.2 при изучении программы, которая должна транслироваться компилятором, не поддерживающим параметры шаблонов по умолчанию, мы писали:

typedef vector::difference_type diff_type

istream_iterator input_set1( infile1 ), eos;

istream_iterator input_set2( infile2 );

где Type – это любой встроенный или пользовательский тип класса, для которого определен оператор ввода. Аргументом конструктора может быть объект либо класса

#include iterator

#include fstream

#include string

#include complex

// прочитать последовательность объектов типа complex

// из стандартного ввода

istream_iterator complex is_complex( cin );

// прочитать последовательность строк из именованного файла

ifstream infile( "C++Primer" );

istream, например cin, либо производного от него класса с открытым типом наследования – ifstream:

istream_iterator string is_string( infile );

При каждом применении оператора инкремента к объекту типа istream_iterator читается следующий элемент из входного потока, для чего используется оператор operator(). Чтобы сделать то же самое в обобщенных алгоритмах, необходимо предоставить пару итераторов, обозначающих начальную и конечную позицию в файле.

// конструирует итератор end_of_stream, который будет служить маркером

// конца потока в итераторной паре

istream_iterator string end_of_stream

vectorstring text;

// правильно: передаем пару итераторов

copy( is_string, end_of_stream,

inserter( text, text.begin() ));

Начальную позицию дает istream_iterator, инициализированный объектом istream, – такой, скажем, как is_string. Для получения конечной позиции мы используем специальный конструктор по умолчанию класса istream_iterator.