Итератор istream_iterator
В общем виде объявление потокового итератора чтения istream_iterator имеет форму:
istream_iterator<Type> identifier( istream& );1.
где Type– это любой встроенный или пользовательский тип класса, для которого определен оператор ввода. Аргументом конструктора может быть объект либо класса istream, например cin, либо производного от него класса с открытым типом наследования – ifstream:
#include <iterator>
#include <fstream>
#include <string>
#include <complex>
// прочитать последовательность объектов типа complex
// из стандартного ввода
istream_iterator< complex > is_complex( cin );
// прочитать последовательность строк из именованного файла
ifstream infile( "C++Primer" );
istream_iterator< string > is_string( infile );
При каждом применении оператора инкремента к объекту типа istream_iterator читается следующий элемент из входного потока, для чего используется оператор operator>>(). Чтобы сделать то же самое в обобщенных алгоритмах, необходимо предоставить пару итераторов, обозначающих начальную и конечную позицию в файле. Начальную позицию дает istream_iterator, инициализированный объектом istream, – такой, скажем, как is_string. Для получения конечной позиции мы используем специальный конструктор по умолчанию класса istream_iterator:
// конструирует итератор end_of_stream, который будет служить маркером
// конца потока в итераторной паре
istream_iterator< string > end_of_stream
vector<string> text;
// правильно: передаем пару итераторов
copy( is_string, end_of_stream,
inserter( text, text.begin() ));