Namespaces
Variants

C++ named requirements: LegacyOutputIterator

From cppreference.net
C++ named requirements

Ein LegacyOutputIterator ist ein LegacyIterator , der auf das referenzierte Element schreiben kann.

Ein Beispiel für einen Typ, der LegacyOutputIterator implementiert, ist std::ostream_iterator .

Wenn ein LegacyForwardIterator , LegacyBidirectionalIterator oder LegacyRandomAccessIterator zusätzlich zu seinen eigenen Anforderungen auch die LegacyOutputIterator -Anforderungen erfüllt, wird er als mutable bezeichnet.

Inhaltsverzeichnis

Anforderungen

Der Typ X erfüllt die Anforderungen von LegacyOutputIterator wenn

  • Der Typ X erfüllt die Anforderungen von LegacyIterator
  • X ist ein Klassentyp oder ein Zeigertyp

Und, gegeben

  • o , ein Wert eines Typs, der in den Ausgabeiterator geschrieben werden kann (es können mehrere Typen schreibbar sein, z.B. wenn operator = ein Template sein kann. Es gibt kein Konzept von value_type wie bei den Eingabeiteratoren)
  • r , ein Lvalue vom Typ X ,

Die folgenden Ausdrücke müssen gültig sein und ihre spezifizierten Effekte haben

Ausdruck Rückgabe Äquivalenter Ausdruck Vorbedingung Nachbedingungen Anmerkungen
* r = o (nicht verwendet) r ist dereferenzierbar r ist inkrementierbar Nach dieser Operation muss r nicht dereferenzierbar sein und Kopien des vorherigen Werts von r müssen nicht mehr dereferenzierbar oder inkrementierbar sein.
++ r X & r ist inkrementierbar r und ++ r bezeichnen dasselbe Iterator-Objekt, r ist dereferenzierbar oder past-the-end Nach dieser Operation muss r nicht inkrementierbar sein und Kopien des vorherigen Werts von r müssen nicht mehr dereferenzierbar oder inkrementierbar sein.
r ++ konvertierbar zu const X & X temp = r ;

++ r ;
return temp ;

* r ++ = o (nicht verwendet) * r = o ;

++ r ;

Hinweise

Die einzige gültige Verwendung von operator * mit einem Output-Iterator ist links von einer Zuweisung: operator * kann ein Proxy-Objekt zurückgeben, das ein Member operator = definiert (welcher ein Template sein kann).

Gleichheit und Ungleichheit sind für Ausgabeiteratoren möglicherweise nicht definiert. Selbst wenn ein operator == definiert ist, x == y muss nicht ++ x == ++ y implizieren.

Die Zuweisung durch denselben Wert eines Ausgabe-Iterators erfolgt nur einmal: Algorithmen auf Ausgabe-Iteratoren müssen Einzelgang-Algorithmen sein.

Die Zuweisung über einen Ausgabe-Iterator soll sich mit dem Inkrementieren abwechseln. Doppeltes Inkrementieren ist undefiniertes Verhalten (der C++-Standard behauptet derzeit, dass doppeltes Inkrementieren unterstützt wird, im Widerspruch zur STL-Dokumentation; dies ist LWG issue 2035 ).

Einem reinen Nur-Ausgabe-Iterator ist es erlaubt, seine iterator_traits < X > :: value_type , iterator_traits < X > :: difference_type , iterator_traits < X > :: pointer und iterator_traits < X > :: reference als void zu deklarieren (und Iteratoren wie std::back_insert_iterator tun genau das mit Ausnahme von difference_type , das nun definiert ist, um std::output_iterator zu erfüllen (seit C++20) ).

Standardbibliothek

Die folgenden Standardbibliothek-Iteratoren sind Ausgabeiteratoren, die keine Vorwärtsiteratoren sind:

Ausgabeiterator, der in std::basic_ostream schreibt
(Klassentemplate)
Ausgabeiterator, der in std::basic_streambuf schreibt
(Klassentemplate)
Iterator-Adapter für das Einfügen in einen Container
(Klassentemplate)
Iterator-Adapter für das Einfügen am Ende eines Containers
(Klassentemplate)
Iterator-Adapter für das Einfügen am Anfang eines Containers
(Klassentemplate)

Siehe auch

spezifiziert, dass ein Typ ein Ausgabeiterator für einen gegebenen Werttyp ist, d.h. Werte dieses Typs können in ihn geschrieben werden und er kann sowohl prä- als auch postinkrementiert werden
(Konzept)
Iterator-Bibliothek stellt Definitionen für Iteratoren, Iterator-Traits, Adapter und Hilfsfunktionen bereit