Итераторы ввода (Input iterators)
Класс или встроенный тип X удовлетворяет требованиям итератора ввода для значимого типа T, если справедливы следующие выражения:
выражение | возвращаемый тип | семантика исполнения | утверждение/примечание состояние до/после |
| |||
X(a) | . | . | X(a)- копия a. примечание: предполагается деструктор. |
X u(a); X u = a; |
. | . | после: u - копия a. |
u = a | X& | . | после: u - копия a. |
a == b | обратимый в bool | . | если a - копия b, тогда a == b
возвращает true. == - это отношение эквивалентности в области действия ==. |
a != b | обратимый в bool | !(a == b) | . |
*a | обратимый в T | . | до: a - разыменовываемое. если a - копия b, то *a эквивалентно *b. |
++r | X& | . | до: r - разыменовываемое. после:r - разыменовываемое или r - законечное. |
void r++ | void | void ++r | . |
*r++ | Т | { X tmp = r; ++r; return tmp; } |
. |
ПРИМЕЧАНИЕ. Для итераторов ввода нет никаких требований на тип или значение r++ кроме требования, чтобы *r++ работал соответственным образом. В частности, r == s не подразумевает, что ++r == ++s. (Равенство не гарантирует свойство замены или ссылочной прозрачности.) Что касается ++r, то нет больше никаких требований на значения любых копий r за исключением того, что они могут быть безопасно уничтожены или присвоены. После выполнения ++r не требуется, чтобы были копии (предыдущего) r в области ==. Алгоритмы с итераторами ввода никогда не должны пытаться проходить через тот же самый итератор дважды. Они должны быть однопроходными (single pass) алгоритмами. Не требуется, чтобы значимый тип T был леводопустимым типом (lvalue type). Эти алгоритмы могут использоваться с входными потоками как источниками входных данных через класс istream_iterator.