|
||||
|
ИТЕРАТОРЫ ПОТОКОВЧтобы шаблоны алгоритмов могли работать непосредственно с потоками ввода-вывода, предусмотрены соответствующие шаблонные классы, подобные итераторам. Например, partial_sum_copy(istream_iterator‹double›(cin), istream_iterator‹double›(), ostream_iterator‹double›(cout, "\n")); читает файл, содержащий числа с плавающей запятой, из cin и печатает частичные суммы в cout. Итератор входного потока (Istream Iterator)istream_iterator‹T› читает (используя operator››) последовательные элементы из входного потока, для которого он был создан. После своего создания итератор каждый раз при использовании ++ читает и сохраняет значение T. Если достигнут конец потока (operator void* () в потоке возвращает false), итератор становится равным значению end-of-stream (конец-потока). Конструктор без параметров istream_iterator() всегда создаёт итераторный объект конца потокового ввода, являющийся единственым законным итератором, который следует использовать для конечного условия. Результат operator* для конца потока не определён, а для любого другого значения итератора возвращается const T&. Невозможно записывать что-либо с использованием входных итераторов. Основная особенность входных итераторов - тот факт, что операторы ++ не сохраняют равенства, то есть i==j не гарантирует вообще, что ++i==++j. Каждый раз, когда ++ используется, читается новое значение. Практическое следствие этого факта - то, что входные итераторы могут использоваться только для однопроходных алгоритмов, что действительно имеет здравый смысл, так как многопроходным алгоритмам всегда более соответствует использование структур данных в оперативной памяти. Два итератора конец-потока всегда равны. Итератор конец-потока не равен не-конец-потока итератору. Два не-конец-потока итератора равны, когда они созданы из того же самого потока. template ‹class T, class Distance = ptrdiff_t› class istream_iterator: public input_iterator‹T, Distance› { friend bool operator==(const istream_iterator‹T, Distance›& x, const istream_iterator‹T, Distance›& y); public: istream_iterator(); istream_iterator(istream& s); istream_iterator(const istream_iterator‹T, Distance›& x); ~istream_iterator(); const T& operator*() const; istream_iterator‹T, Distance›& operator++(); istream_iterator‹T, Distance› operator++(int); }; template ‹class T, class Distance› bool operator==(const istream_iterator‹T, Distance›& x, const istream_iterator‹T, Distance›& y); Итератор выходного потока (Ostream Iterator)istream_iterator‹T› записывает (используя operator‹‹) последовательные элементы в выходной поток, из которого он был создан. Если он был создан с параметром конструктора char*, эта строка, называемая строкой разделителя (delimiter string), записывается в поток после того, как записывается каждое T. Невозможно с помощью выходного итератора получить значение. Его единственное использование - выходной итератор в ситуациях, подобных нижеследующему: while (first != last) *result++ = *first++; ostream_iterator определён как: template ‹class T› class ostream_iterator: public output_iterator { public: ostream_iterator(ostream& s); ostream_iterator(ostream& s, const char* delimiter); ostream_iterator(const ostream_iterator‹T›& x); ~ostream_iterator(); ostream_iterator‹T›& operator=(const T& value); ostream_iterator‹T›& operator*(); ostream_iterator‹T›& operator++(); ostream_iterator‹T›& operator++(int); }; |
|
||
Главная | В избранное | Наш E-MAIL | Прислать материал | Нашёл ошибку | Наверх |
||||
|