C++ named requirements: LegacyOutputIterator
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_typewie 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
;
|
|||
| * 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
|
(C++20)
|
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 |