27 Iterators library [iterators]

27.2 Iterator requirements [iterator.requirements]

27.2.3 Input iterators [input.iterators]

Класс или указатель типа X удовлетворяет требования входного итератора для типа значения ,T если X удовлетворяют Iterator и EqualityComparable требования и выражение , приведенные в таблице 95 , действительны и имеют указанную семантику.

В Таблице 95этот термин the domain of == используется в обычном математическом смысле для обозначения набора значений, для которых == (требуется) определение. Этот набор может меняться со временем. Каждый алгоритм предъявляет дополнительные требования к области == значений используемых итераторов. Эти требования могут быть выведены из использования алгоритма == и !=. [ Example: Вызов find(a,b,x) определяется только в том случае, если значение a имеет свойство, p определенное следующим образом: b имеет свойство, p а значение i имеет свойство p if (*i==x) или if (*i!=x и ++i имеет свойство p). ]end example

Таблица 95 - Требования к итератору ввода (в дополнение к Iterator)
ВыражениеТип возвратаОперативныйУтверждение / примечание
семантикадо / после состояния
a != b контекстно конвертируемый в bool !(a == b) Requires: (a, b) находится в домене ==.
*a reference, конвертируемый в T Requires: a разыменуемо.
Выражение
(void)*a, *a эквивалентно *a.
Если a == b и (a, b) находится в домене, == то *a эквивалентно *b.
a->m (*a).m Requires: a разыменуемо.
++r X& Requires: r разыменуемо.
Postconditions: r разыменован или окончен r ;
любые копии предыдущего значения r больше не должны быть разыменованными или находиться в домене ==.
(void)r++ эквивалентно (void)++r
*r++ конвертируемый в T { T tmp = *r;
++r;
return tmp; }

[ Note: Для итераторов ввода a == b не означает ++a == ++b. (Равенство не гарантирует свойство подстановки или ссылочную прозрачность.) Алгоритмы на итераторах ввода никогда не должны пытаться пройти через один и тот же итератор дважды. Это должны быть single pass алгоритмы. Тип значения T не обязательно должен быть CopyAssignable типом. Эти алгоритмы могут использоваться с istreams в качестве источника входных данных через istream_­iterator шаблон класса. ]end note