Программирование >>  Инициализация объектов класса, структура 

1 ... 187 188 189 [ 190 ] 191 192 193 ... 395


#include <iterator> #include <fstream> #include <string> #include <complex>

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

istream iterator< complex > is complex( cin );

прочитать последовательность строк из именованного файла ifstream infile( C++Primer );

наследования - ifstream:

istream iterator< string > is string( infile );

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

конструирует итератор end of stream, котор будет служить маркером

конца потока в итераторной паре istream iterator< string > end of stream

vector<string> text;

правильно: передаем пару итераторов copy( is string, end of stream,

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

используем специальный конструктор по умолчанию класса istream iterator:

12.4.5. Итератор ostream iterator

Объявление потокового итератора записи ostream iterator может быть представлено в двух формах:

Если бы компилятор полностью удовлетворял стандарту C++, достаточно было бы написать так:

istream iterator< string > input set1( infile1 ), eos; istream iterator< string > input set2( infile2 );

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



ostream iterator<Type> identifier( ostream& )

ostream iterator<Type> identifier( ostream&, char * delimiter )

где Type - это любой встроенный или пользовательский тип класса, для которого определен оператор вывода (operator<<). Во второй форме delimiter - это разделитель, то есть C-строка символов, которая выводится в файл после каждого элемента. Такая строка должна заканчиваться двоичным нулем, иначе поведение программы не определено (скорее всего, она аварийно завершит выполнение). В качестве аргумента ostream может выступать объект класса ostream, например cout, либо

#include <iterator> #include <fstream> #include <string> #include <complex>

записать последовательность объектов типа complex в стандартн вывод, разделяя элементы пробелами ostream iterator< complex > os complex( cin, );

записать последовательность строк в именованн файл ofstream outfile( dictionary );

производного от него класса с открытым типом наследования, скажем ofstream:

ostream iterator< string > os string( outfile, \n ); Вот простой пример чтения из стандартного ввода и копирования на стандартный вывод

#include <iterator> #include <algorithm> #include <iostream>

int main()

copy( istream iterator< int

cin ),

istream iterator< int >(), ostream iterator< int >( cout, ));

с помощью безымянных потоковых итераторов и обобщенного алгоритма copy() :

Ниже приведена небольшая программа, которая открывает указанный пользователем файл и копирует его на стандартный вывод, применяя для этого алгоритм copy() и потоковый итератор записи ostream iterator:



#include <string>

#include <algorithm>

#include <fstream>

#include <iterator>

main()

string file name;

cout << please enter a file to open: ; cin >> file name;

if ( file name.empty() !cin cerr << unable to read file n }

<< unable to read file name\n ; return -1;

fstream infile( file name.c str());

f ( !infile ) {

cerr << unable to open << file name << endl;

return -2;

istream iterator< string > ins( infile ), eos; ostream iterator< string > outs( cout, ); copy( ins, eos, outs );

12.4.6. Пять категорий итераторов

Для поддержки полного набора обобщенных алгоритмов стандартная библиотека определяет пять категорий итераторов, положив в основу классификации множество операций. Это итераторы чтения (InputIterator), записи (OutputIterator), однонаправленные (ForwardIterator) и двунаправленные итераторы (BidirectionalIterator), а также итераторы с произвольным доступом (RandomiAccessIterators). Ниже приводится краткое обсуждение характеристик каждой категории:

итератор чтения можно использовать для получения элементов из контейнера, но поддержка записи в контейнер не гарантируется. Такой итератор должен обеспечивать следующие операции (итераторы, поддерживающие также дополнительные операции, можно употреблять в качестве итераторов чтения при условии, что они удовлетворяют минимальным требованиям): сравнение двух итераторов на равенство и неравенство, префиксная и постфиксная форма инкремента итератора для адресации следующего элемента (оператор ++), чтение элемента с помощью оператора разыменования (*). Такого уровня поддержки требуют, в частности, алгоритмы find() , accumulate() и equal() . Любому алгоритму, которому необходим итератор чтения, можно передавать также и итераторы категорий, описанных в пунктах 3, 4 и 5;

итератор записи можно представлять себе как противоположный по функциональности итератору чтения. Иными словами, его можно использовать для записи элементов контейнера, но поддержка чтения из контейнера не гарантируется. Такие итераторы обычно применяются в качестве третьего аргумента алгоритма (например, copy() ) и указывают на позицию, с которой надо начинать копировать.



1 ... 187 188 189 [ 190 ] 191 192 193 ... 395

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика