Если соединить итераторы ввода и вывода, то получится однонаправленный итератор (forward iterator), который может перемещаться по цепочке объектов в одном направлении, за что и получил такое название. Для такого перемещения в итераторе определена операция инкремента (++). И разумеется, в однонаправленном итераторе есть операторы сравнения (== и !=), присвоения (=) и разыменовывания (*). Все эти операторы можно увидеть, если посмотреть, как реализован, например, алгоритм replace, заменяющий одно определенное значение на другое:
template <class ForwardIterator, class T>
void replace (ForwardIterator first, ForwardIterator last, const T& old_value,
const T& new_value)
{
while (first != last)
{
if (*first == old_value) *first = new_value;
++first;
}
}
Чтобы убедиться в правильности работы всех операторов однонаправленных итераторов, составим программу, заменяющую в исходном массиве все единицы на нули и наоборот, т. е. произведем инверсию. С этой целью все нули изначально заменяются на некоторое нейтральное значение, например на двойку, затем все единицы обнуляются, а все двойки становятся единицами:
#include <algorithm>
#include <iostream>
using namespace std;
main(void)
{
replace(init, init + 5, 0, 2);
replace(init, init + 5, 1, 0);
replace(init, init + 5, 2, 1);
copy(init, init + 5, ostream_iterator<int>(cout, "n"));
}
Как видите, алгоритм replace, умело используя однонаправленные итераторы, читает значения, заменяет их и перемещается от одного к другому.