C++ benannte Anforderungen: LegacyOutputIterator
Ein LegacyOutputIterator ist ein LegacyIterator, der in das Element schreiben kann, auf das gezeigt wird.
Ein Beispiel für einen Typ, der LegacyOutputIterator implementiert, ist std::ostream_iterator.
Wenn LegacyForwardIterator, LegacyBidirectionalIterator oder LegacyRandomAccessIterator zusätzlich zu seinen eigenen Anforderungen die LegacyOutputIterator-Anforderungen erfüllt, wird er als mutable bezeichnet.
Inhalt |
[bearbeiten] Anforderungen
Der Typ X erfüllt LegacyOutputIterator, wenn
- Der Typ X erfüllt LegacyIterator
- X ist ein Klassentyp oder ein Zeigertyp
Und, gegeben
- o, ein Wert eines beliebigen Typs, der in den Ausgabeiterator geschrieben werden kann (es kann mehrere Typen geben, die geschrieben werden können, z.B. wenn operator= eine Vorlage sein kann. Es gibt keine Vorstellung von
value_typewie bei Eingabeiteratoren) - r, ein lvalue vom Typ X,
Die folgenden Ausdrücke müssen gültig sein und ihre angegebenen Effekte haben
| Ausdruck | Rückgabe | Äquivalenter Ausdruck | Vorbedingung | Nachbedingungen | Anmerkungen |
|---|---|---|---|---|---|
| *r = o | (nicht verwendet) | r ist dereferenzierbar | r ist inkrementierbar | Nach dieser Operation ist r nicht erforderlich dereferenzierbar zu sein, und Kopien des vorherigen Werts von r sind nicht mehr erforderlich dereferenzierbar oder inkrementierbar zu sein. | |
| ++r | X& | r ist inkrementierbar | r und ++r bezeichnen dasselbe Iterator-Objekt, r ist dereferenzierbar oder past-the-end | Nach dieser Operation ist r nicht erforderlich inkrementierbar zu sein, und Kopien des vorherigen Werts von r sind nicht mehr erforderlich dereferenzierbar oder inkrementierbar zu sein. | |
| r++ | konvertierbar zu const X& | X temp = r; ++r; |
|||
| *r++ = o | (nicht verwendet) | *r = o; ++r; |
[bearbeiten] Hinweise
Die einzig sinnvolle Verwendung von operator* mit einem Ausgabeiterator ist auf der linken Seite einer Zuweisung: operator* kann ein Proxy-Objekt zurückgeben, das einen Member operator= (der eine Vorlage sein kann) definiert.
Gleichheit und Ungleichheit müssen für Ausgabeiteratoren nicht definiert sein. Selbst wenn ein operator== definiert ist, muss x == y nicht implizieren, dass ++x == ++y.
Zuweisung über denselben Wert eines Ausgabeiterators erfolgt nur einmal: Algorithmen mit Ausgabeiteratoren müssen Einpass-Algorithmen sein.
Zuweisung über einen Ausgabeiterator wird erwartet, dass sie mit Inkrementierung wechselt. Doppeltes Inkrementieren ist undefiniertes Verhalten (der C++-Standard behauptet derzeit, dass doppeltes Inkrementieren unterstützt wird, im Gegensatz zur STL-Dokumentation; dies ist LWG-Problem 2035).
Ein reiner Ausgabeiterator darf seinen iterator_traits<X>::value_type, iterator_traits<X>::difference_type, iterator_traits<X>::pointer und iterator_traits<X>::reference als void deklarieren (und Iteratoren wie std::back_insert_iterator tun genau das mit Ausnahme von difference_type, das jetzt als erfüllend für std::output_iterator definiert ist(seit C++20)).
[bearbeiten] Standardbibliothek
Die folgenden Standardbibliotheksiteratoren sind Ausgabeiteratoren, die keine Vorwärtsiteratoren sind
| Ausgabe-Iterator, der in std::basic_ostream schreibt (Klassenvorlage) | |
| Ausgabe-Iterator, der in std::basic_streambuf schreibt (Klassenvorlage) | |
| Iterator-Adapter für die Einfügung in einen Container (Klassenvorlage) | |
| Iterator-Adapter für die Einfügung am Ende eines Containers (Klassenvorlage) | |
| Iterator-Adapter für die Einfügung am Anfang eines Containers (Klassenvorlage) |
[bearbeiten] Siehe auch
| (C++20) |
spezifiziert, dass ein Typ ein Ausgabeiterator für einen gegebenen Werttyp ist, d. h. Werte dieses Typs können hineingeschrieben werden und er kann sowohl prä- als auch post-inkrementiert werden (Konzept) |
| Iterator-Bibliothek | stellt Definitionen für Iteratoren, Iterator-Traits, Adaptoren und Hilfsfunktionen bereit |