С++ Итераторы потоков

На основе итераторов потоков и контейнеров STL можно создавать объекты, с которыми будут работать стандартные алгоритмы STL!

Требует подключения заголовка #include <iterator> Предоставляет: ostream_iterator<T> и istream_iterator<T>

Выходной итератор:

// Присваивание *оо выполняет запись в поток cout 
ostream_iterator<string> out{cout}; 

// Эквивалентно: cout << "Hello" 
*out = "Hello";
// "Готов к выводу следующего элемента" 
++out;
// Эквивалентно: cout << "World!\n"
*out = "World!\n";  

Входной итератор:

istream_iterator<string> in{cin};

string s1 = *in;
// если не переставить то перемменой 
// ниже присвоится тоже значение
in++;
string s2 = *in;

Для работы с потоковыми итераторами необходимо создать потоковый тиератор, передав его конструктору соотв. поток. Затем на основе потоковых итераторов можно создать объект-контейнер и использовать его в различных алгоритмах.

Используя итераторы ostream_iterator и istream_iterator, можно использовать алгоритм сору () для осуществления ввода-вывода:

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

string from, to;
cin >> from >> to;

ifstream is{from};
ofstream os{to};

istream_iterator<string> ii {is};
istream_iterator<string> eos;
ostream_iterator<string> oo {os, "\n"};

copy(ii, eos, oo);

Можно использовать преимущества структур данных и алгоритмов, например отсортировать слова в потоке:

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

string from, to;
cin >> from >> to;

ifstream is{from};
ofstream os{to}; 

istream_iterator<string> ii {is};
istream_iterator<string> eos;
ostream_iterator<string> oo {os, "\n"};

vector<string> b{ii, eos};
sort(b.begin(), b.end());
copy(b.begin(), b.end(), oo);

Или используя set читать только уникальные слова:

string from, to;
cin >> from >> to;

ifstream is{from};
ofstream os{to};

istream_iterator<string> ii {is};
istream_iterator<string> eos;
ostream_iterator<string> oo {cout, "\n"};

set<string> b{ii, eos};

copy(b.begin(), b.end(), oo);