What\'s the difference between input iterators and read-only forward iterators?
Because the latter are read-only, they obviously don\'t satisfy requirements of outpu
Yes, input iterators are one-pass iterators. You can only iterate over them once, while forward iterators are multi-pass.
From §24.2.3 [input.iterators] p2 (the table)
, pre-/postcondition column of ++r
:
pre:
r
is dereferenceable.
post:r
is dereferenceable orr
is past-the-end.
post: any copies of the previous value ofr
are no longer required either to be dereferenceable or to be in the domain of==
.
The last postcondition implies that for a == b
, ++a == ++b
is not required to be true
.
Same clause, paragraph 3:
[ Note: For input iterators, a == b does not imply ++a == ++b. (Equality does not guarantee the substitution property or referential transparency.) Algorithms on input iterators should never attempt to pass through the same iterator twice. They should be single pass algorithms. [...] These algorithms can be used with istreams as the source of the input data through the
istream_iterator
class template. —end note ]
From §24.2.5 [forward.iterators]
p1 A class or pointer type
X
satisfies the requirements of a forward iterator if
- [...]
- objects of type
X
offer the multi-pass guarantee, described below.p3 Two dereferenceable iterators a and b of type
X
offer the multi-pass guarantee if:
a == b
implies++a == ++b
andX
is a pointer type or the expression(void)++X(a), *a
is equivalent to the expression*a
.