Lesearbeitsentwurf N3337-1, Standard für Programmiersprache C ++, 24.2.5 Vorwärtsiteratoren, Seite 806.
Vom Entwurf:
Zwei dereferenzierbare Iteratoren a
und b
des Typs X
bieten die Multi-Pass-Garantie, wenn:
- a == b
bedeutet ++a == ++b
und
- X
ist ein Zeigertyp oder der Ausdruck (void)++X(a), *a
entspricht dem Ausdruck *a
.
[Hinweis: Die Anforderung, dass a == b
impliziert ++a == ++b
(was nicht für Eingabe- und Ausgabe-Iteratoren gilt) und das Entfernen der Beschränkungen für die Anzahl der Zuweisungen durch einen veränderbaren Iterator (was für Ausgabe-Iteratoren gilt) ermöglicht die Verwendung von mehrwegigen eindirektionalen Algorithmen mit Vorwärts-Iteratoren.
-Hinweis]
Könnte jemand das leichter umdeuten? Ich verstehe, dass Vorwärts-Iteratoren Multi-Pass sind, aber ich verstehe nicht, wie dies gemäß C ++ - Standardanforderungen erreicht wird.
Die Begriffe sagen alles aus, ich würde denken: Sie können die Sequenz mehrmals durchlaufen und sich Positionen innerhalb der Sequenz merken. Solange sich die Sequenz nicht ändert, werden Sie, ausgehend von einer bestimmten Position (Iterator), in der gleichen Reihenfolge so oft wie gewünscht über dieselben Objekte verfahren. Sie können jedoch nur vorwärts gehen, es gibt keine Möglichkeit, sich rückwärts zu bewegen. Das kanonische Beispiel einer solchen Sequenz ist eine einfach verknüpfte Liste.
Die quoted-Klausel sagt im Grunde, dass wenn Sie zwei Iteratoren haben, die das Gleiche vergleichen und Sie jedes von ihnen erhöhen, erhalten Sie dieselbe Position und vergleichen sie gleich wieder:
%Vor% Der etwas seltsame Ausdruck ++X(a), *a
ist im Grunde dazu gedacht, einen Iterator unabhängig von a
zu entwickeln, und die Anforderung, dass ++X(a), *a
äquivalent zu *a
ist, bedeutet im Grunde, dass sich der Iterator über die Sequenz mit einem unabhängigen Iterator nicht ändert worauf sich a
bezieht. Anders als beim Eingabe-Iterator ist ++InIt(a), *a
nicht unbedingt gleichbedeutend mit *a
, da der erste Ausdruck die Position ändern kann, möglicherweise a
ungültig macht und / oder den Wert, auf den er sich bezieht, ändert.
Im Gegensatz dazu kann die Single-Pass-Sequenz (Eingabe- und Ausgabe-Iterationen in Standardbegriffen) nur einmal durchlaufen werden: Der Versuch, die Sequenz mehrmals zu durchlaufen, wird nicht unbedingt funktionieren. Das kanonische Beispiel für solche Sequenzen wird über die Tastatur eingegeben und an die Konsole ausgegeben: Nach dem Lesen können Sie die gleichen Zeichen nicht mehr zurückerhalten und nach dem Senden können Sie die Zeichen nicht mehr rückgängig machen.