Итератор входного потока (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);