При использовании итератора ввода вам разрешено проходить через диапазон только один раз.То есть после разыменования и увеличения итератора вы не сможете вернуться и разыменовать его снова.
Этот класс итераторов весьма полезен для многих вещей.Например, если вы читаете из какого-то потока, как только вы прочитаете что-то из потока, вы не сможете вернуться и прочитать это снова;Вы не можете сохранить копию итератора, продолжить итерацию с исходным итератором, затем вернуться и начать итерацию с копией и предположить, что вы получите те же результаты.
В своем алгоритме вы передаетечерез диапазон более одного раза (см. комментарии в вашем источнике здесь):
template <class In1, class In2>
In1 search(In1 b, In1 e, In2 b2, In2 e2)
{
if (b2 != e2) {
while (b != e) {
if (*b == *b2) {
In1 bc = b; // copy iterator b
In2 b2c = b2;
while (bc != e && b2c != e2 && *bc == *b2c) {
++bc; // increment the copy of iterator b
++b2c;
}
if (b2c == e2)
return b;
}
++b; // increment the original b
}
}
return e;
}
ForwardIterator
- это самый базовый тип итератора, который можно использовать для многопроходных алгоритмов, поскольку он гарантирует, что вы можетеитерация по диапазону несколько раз.
Независимо от категории итератора, является ли итератор изменчивым или неизменным (то есть можно ли изменить элемент, к которому относится итератор его типа): a ForwardIterator
может быть неизменным.Например, константные итераторы любой категории итераторов являются неизменяемыми (или, для конкретного примера, std::forward_list<int>::const_iterator
в C ++ 0x является неизменяемым прямым итератором).