Подтвердить что ты не робот

Какая разница между входными итераторами и итераторами только для чтения?

Какая разница между итераторами ввода и итераторами только для чтения?

Поскольку последние доступны только для чтения, они явно не удовлетворяют требованиям выходных итераторов. И из-за этого они эффективно вводят итераторы с дополнительными гарантиями (если есть). Проблема в том, какие дополнительные гарантии?

Мое предположение было бы то, что передовые итераторы являются многопроходными, а итераторы ввода - нет, я прав?

4b9b3361

Ответ 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.