Stream-Iteratoren bieten eine Iterator-Schnittstelle für die formatierten Extraktions- / Einfügeoperationen von Iostreams. Betrachten Sie beispielsweise Folgendes:
%Vor%Dies entspricht:
%Vor% Vorantreiben des Iterators führt eine Exkretion aus, ähnlich wie std::cin >> n
; Wenn die Extraktion fehlschlägt, nimmt der Iterator den singulären Status an, der auch der Status des standardmäßig erstellten Iterators ist.
Diese Stream-Iteratoren sind ihrer Natur nach Single-Pass , d. h. die schwächste Art von Iterator: Sie können nur jedes Element im "Bereich" nur einmal besuchen und niemals zurückgehen; und zwei Nicht-Ende-Iteratoren, die aus demselben Strom aufgebaut sind, vergleichen Gleichheit, obwohl dies keine Bedeutung in Bezug auf den dereferenzierten Wert hat. (Aber beachten Sie, dass es einen merkwürdigen Mangel an Spezifität gibt, ob die erste Extraktion jemals versucht wird, wenn Sie den Iterator niemals dereferenzieren.)
Nur der Vollständigkeit halber können Ausgabe-Stream-Iteratoren ähnlich verwendet werden, um einen Stream in einen "Container" zu verwandeln, der für Algorithmen nützlich ist, die mit Iteratoren arbeiten:
%Vor%Ausgabe-Stream-Iteratoren führen ihre Arbeit aus, wenn sie zugewiesen sind; die anderen Operationen sind No-Ops.
Interessanterweise gibt es keinen Stream-Iterator, der getline
umschließt; Leute schreiben oft selbst, weil Iterator-Interfaces in vielerlei Hinsicht nützlich sind.
Stream-Iteratoren ermöglichen es Ihnen, einen Stream als Quelle oder Ziel für einen Algorithmus zu verwenden, der einen Eingabe- oder Ausgabe-Iterator erwartet.
Sie dienen hauptsächlich dazu, einer Basisfunktionalität eine einheitliche Schnittstelle zu geben, so dass Sie (zum Beispiel) keine Zwischenergebnisse in einer Sammlung im Speicher erzeugen müssen, und dann Ihre Daten von dort in eine Ausgabedatei kopieren ( und ebenso mit Eingaben).
Soweit es funktioniert, speichert ein istream_iterator normalerweise ein T-Objekt intern. Wenn Sie den Iterator erstellen, liest (oder versucht) er ein T aus der Datei mit stream >> value;
. operator *
gibt Ihnen Zugriff auf diesen Wert. operator++
liest den nächsten Wert.
Ebenso schreibt ein ostream_iterator ein Element in die Datei, wenn Sie es zuweisen. Da der Stream automatisch fortschreitet, tut operator++
normalerweise nichts (außer einen Verweis auf den Iterator zurückzugeben). Wenn Sie sich wirklich in die Details vertiefen möchten (wie sie sind), können Sie sich die infix_ostream_iterator
Ich habe vor einiger Zeit gepostet.
Tatsächlich sind die Stream-Iteratoren alleine nicht nützlich. Eine Reihe von Algorithmen, die mit Iteratoren arbeiten, machen sie nützlich.
Als Beispiel, um zu zeigen, was Kerrek und Jerry bereits gesagt haben:
Anstatt etwas zu schreiben:
%Vor% istream_iterator
und ostream_iterator
ermöglichen es Ihnen, Code zu schreiben, der dasselbe in einer einzigen Zeile ausführt:
Dies vermeidet die vorübergehenden Speicher- und möglichen Schleifenbedingungsfehler (z. B. wenn Sie <=
anstelle von <
schreiben).
Da die Standardalgorithmen Iteratoren verwenden, ermöglicht die Verwendung von Iteratoren für istream
s und ostream
s die Verwendung von Streams mit vielen gängigen Algorithmen.