Ответ 1
Да, итераторы ввода - это однопроходные итераторы. Вы можете перебирать их только один раз, в то время как итераторы вперед - многопроходные.
От §24.2.3 [input.iterators] p2 (the table)
, столбца pre-/postcondition ++r
:
pre:
r
является разыменованным.
post:r
является разыменованным илиr
является последним.
: любые копии предыдущего значенияr
больше не требуются, чтобы быть различимыми или находиться в домене==
.
Последнее постусловие подразумевает, что для a == b
++a == ++b
не требуется true
.
Это же предложение, пункт 3:
[Примечание: для итераторов ввода a == b не означает ++ a == ++ b. (Равенство не гарантирует свойство подстановки или ссылочную прозрачность.) Алгоритмы на итераторах ввода никогда не должны пытаться проходить через один и тот же итератор дважды. Они должны быть однопроходными алгоритмами. [...] Эти алгоритмы могут использоваться с istreams как источник входных данных через шаблон класса
istream_iterator
. -end note]
Из §24.2.5 [forward.iterators]
p1 Класс или тип указателя
X
удовлетворяет требованиям передового итератора, если
- [...]
- объекты типа
X
предлагают многопроходную гарантию, описанную ниже.p3 Два разыменованных итератора a и b типа
X
предлагают многопроходную гарантию, если:
a == b
подразумевает++a == ++b
иX
- тип указателя или выражение(void)++X(a), *a
эквивалентно выражению*a
.