Tak, Iteratory wejściowe są iteratorami jednoprzebiegowymi. Możesz je wykonywać tylko raz, podczas gdy iteratory do przodu są wieloprzebiegowe.
Od §24.2.3 [input.iterators] p2 (the table)
, kolumna pre-/postcondition z ++r
:
pre: r
jest dereferenceable.
post: r
jest dereferencyjne lub r
jest już przeszłością.
post: wszelkie kopie poprzedniej wartości r
nie są już wymagane ani do dereferencji, ani do domeny ==
.
Ostatni postcondition oznacza, że dla a == b
, ++a == ++b
nie jest wymagane, aby true
.
sama klauzula, ustęp 3:
[Uwaga: Dla iteratorów wejściowych a == b nie oznacza ++ ++ a == b. (Równość nie gwarantuje właściwości zastępowania ani przezroczystości referencyjnej). Algorytmy na wejściowych iteratorach nie powinny nigdy próbować przechodzić przez ten sam iterator dwa razy. Powinny one być jednoprzebiegowe algorytmy. [...] Algorytmy te mogą być używane z istreams jako źródłem danych wejściowych poprzez szablon klasy istream_iterator
. końcem uwaga]
Od §24.2.5 [forward.iterators]
p1 klasy lub wskaźnik typu X
spełnia wymogi forward iteratora jeśli
- [...]
- obiektów typu
X
oferują gwarancję wieloprzebiegową, opisaną poniżej.
P3 Dwa dereferenceable iteratory aib typu X
oferują gwarancję wielo przejścia jeżeli:
a == b
implikuje ++a == ++b
i
X
jest rodzajem wskaźnika lub wyrażenie (void)++X(a), *a
jest równoważna do wyrażenia *a
.
Więc typowymi przykładami może być strumień iterator (single-pass, input-iterator), a pojedynczo połączonej listy (multi-pass przodu iterator) – jalf
oh, przy okazji, mają upboat. +1 – jalf