问题
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?
回答1:
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:
ris dereferenceable.
post:ris dereferenceable orris past-the-end.
post: any copies of the previous value ofrare 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_iteratorclass template. —end note ]
From §24.2.5 [forward.iterators]
p1 A class or pointer type
Xsatisfies the requirements of a forward iterator if
- [...]
- objects of type
Xoffer the multi-pass guarantee, described below.p3 Two dereferenceable iterators a and b of type
Xoffer the multi-pass guarantee if:
a == bimplies++a == ++bandXis a pointer type or the expression(void)++X(a), *ais equivalent to the expression*a.
来源:https://stackoverflow.com/questions/8869104/whats-the-difference-between-input-iterators-and-read-only-forward-iterators