2012-01-15 10 views
12

Jaka jest różnica między iteratorami wejściowymi a iteratorami do przodu tylko do odczytu?Jaka jest różnica między iteratorami wejściowymi a iteratorami do przodu tylko do odczytu?

Ponieważ te ostatnie są tylko do odczytu, oczywiście nie spełniają wymagań dla iteratorów wyjściowych. I z tego powodu skutecznie wprowadzają iteratory z dodatkowymi gwarancjami (jeśli są). Problem w tym, jakie dodatkowe gwarancje?

Domyślam się, że forward iteratory są wieloprzebiegowe, a wejściowe iteratory nie, prawda?

Odpowiedz

20

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.
+5

Więc typowymi przykładami może być strumień iterator (single-pass, input-iterator), a pojedynczo połączonej listy (multi-pass przodu iterator) – jalf

+0

oh, przy okazji, mają upboat. +1 – jalf

Powiązane problemy