Reputation:
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 output iterators. And, because of that, they're effectively input iterators with additional guarantees (if any). The problem is, what additional guarantees?
My guess would be that forward iterators are multi-pass and input iterators are not, am I right?
Upvotes: 14
Views: 3231
Reputation: 131799
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
.
Upvotes: 24