Потоковые итераторы: использование функции сору для ввода и вывода
Мы можем применить алгоритм сору для вывода, как показано в следующем фрагменте:
const int N = 4;
int a[N] = {7, б, 9, 2};
copy(a, a+N, ostream_iterator<int>(cout, " "));
Мы также можем определить переменную-итератор i для использования в качестве третьего аргумента функции сору. Это достигается заменой вызова сору следующими двумя операторами:
ostream_iterator<int> i(cout, " "); copy(a, a+N, i);
В любом случае в поток стандартного вывода cout будут выведены числа 7, 6, 9 и 2, как если бы мы написали
for (int* p=a; p!= a+N; p++) cout « *р « " ";
Для ввода мы можем использовать аналогичный прием, написав
istream_iterator<int, ptrdiff_t>(file)
me file является потоком ввода. Это длинное выражение можно, например, употребить вместо v.begin(), которое мы использовали бы для копирования элементов из контейнера v. Если опустить file в приведенной строчке, то получим выражение
istream_iterator<int, ptrdiff_t>()
которое нужно применить вместо v.end(),TaK как это выражение служит для обозначения конца файла. Например, пусть у нас есть файл example.txt со следующим содержанием:
10 20 30 40 50
Известно, что файл содержит только целые числа (разделенные пробелами), но мы не знаем заранее, сколько целых чисел находится в файле. Следующая программа читает целые числа из этого файла и показывает их на экране; условная компиляция используется для совместимости с ВС5, который требует наличия второго аргумента для шаблона istream_iterator.
11 copyio.cpp: Используем алгоритм сору // для ввода-вывода.
#include <fstream> #include <iostream> #include <iterator> #include <vector> using namespace std;
#if defined! BORLANDC ) && _ BORLANDC == 0x530
// Для ВС5.3: typedef istream_iterator<int,
char,
char_traits<char>, ptrdiff_t> istream_iter; #elif defined! BORLANDC ) // Для ВС5.2:
<< назад вперед >>