Namensräume
Varianten
Aktionen

C++ benannte Anforderungen: LegacyOutputIterator

Von cppreference.com
 
 
C++ benannte Anforderungen
 

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_type wie 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;
return temp;

*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) [bearbeiten]
Ausgabe-Iterator, der in std::basic_streambuf schreibt
(Klassenvorlage) [bearbeiten]
Iterator-Adapter für die Einfügung in einen Container
(Klassenvorlage) [bearbeiten]
Iterator-Adapter für die Einfügung am Ende eines Containers
(Klassenvorlage) [bearbeiten]
Iterator-Adapter für die Einfügung am Anfang eines Containers
(Klassenvorlage) [bearbeiten]

[bearbeiten] Siehe auch

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) [bearbeiten]
Iterator-Bibliothek stellt Definitionen für Iteratoren, Iterator-Traits, Adaptoren und Hilfsfunktionen bereit