C++ named requirements: LegacyOutputIterator
Un LegacyOutputIterator est un LegacyIterator qui peut écrire dans l'élément pointé.
Un exemple de type qui implémente LegacyOutputIterator est std::ostream_iterator .
Lorsqu'un LegacyForwardIterator , LegacyBidirectionalIterator , ou LegacyRandomAccessIterator satisfait aux exigences du LegacyOutputIterator en plus de ses propres exigences, il est qualifié de mutable .
Table des matières |
Exigences
Le type X satisfait LegacyOutputIterator si
- Le type X satisfait LegacyIterator
- X est un type classe ou un type pointeur
Et, étant donné
-
o
, une valeur d'un certain type qui peut être écrite dans l'itérateur de sortie (il peut y avoir plusieurs types écrivables, par exemple si
operator
=
peut être un modèle. Il n'y a pas de notion de
value_typecomme pour les itérateurs d'entrée) - r , une lvalue de type X ,
Les expressions suivantes doivent être valides et avoir leurs effets spécifiés
| Expression | Retour | Expression équivalente | Précondition | Postconditions | Notes |
|---|---|---|---|---|---|
| * r = o | (non utilisé) | r est déréférençable | r est incrémentable | Après cette opération r n'est pas requis d'être déréférençable et toute copie de la valeur précédente de r n'est plus requise d'être déréférençable ou incrémentable. | |
| ++ r | X & | r est incrémentable | r et ++ r désignent le même objet itérateur, r est déréférençable ou past-the-end | Après cette opération r n'est pas requis d'être incrémentable et toute copie de la valeur précédente de r n'est plus requise d'être déréférençable ou incrémentable. | |
| r ++ | convertible en const X & |
X temp
=
r
;
++
r
;
|
|||
| * r ++ = o | (non utilisé) |
*
r
=
o
;
++ r ; |
Notes
La seule utilisation valide de operator * avec un itérateur de sortie est à gauche d'une affectation : operator * peut renvoyer un objet proxy, qui définit un membre operator = (qui peut être un template).
L'égalité et l'inégalité peuvent ne pas être définies pour les itérateurs de sortie. Même si un operator == est défini, x == y n'implique pas nécessairement ++ x == ++ y .
L'assignation via la même valeur d'un itérateur de sortie se produit une seule fois : les algorithmes sur les itérateurs de sortie doivent être des algorithmes à passage unique.
L'assignation via un itérateur de sortie est censée alterner avec l'incrémentation. Le double incrément est un comportement indéfini (la norme C++ prétend actuellement que le double incrément est supporté, contrairement à la documentation STL ; ceci est LWG issue 2035 ).
Il est permis à un itérateur de sortie pur de déclarer son
iterator_traits
<
X
>
::
value_type
,
iterator_traits
<
X
>
::
difference_type
,
iterator_traits
<
X
>
::
pointer
, et
iterator_traits
<
X
>
::
reference
comme étant
void
(et les itérateurs tels que
std::back_insert_iterator
font exactement cela
sauf pour
difference_type
, qui est maintenant défini pour satisfaire
std::output_iterator
(depuis C++20)
).
Bibliothèque standard
Les itérateurs de bibliothèque standard suivants sont des itérateurs de sortie qui ne sont pas des itérateurs avant :
|
itérateur de sortie qui écrit vers
std::basic_ostream
(modèle de classe) |
|
|
itérateur de sortie qui écrit vers
std::basic_streambuf
(modèle de classe) |
|
|
adaptateur d'itérateur pour l'insertion dans un conteneur
(modèle de classe) |
|
|
adaptateur d'itérateur pour l'insertion à la fin d'un conteneur
(modèle de classe) |
|
|
adaptateur d'itérateur pour l'insertion au début d'un conteneur
(modèle de classe) |
Voir aussi
|
(C++20)
|
spécifie qu'un type est un itérateur de sortie pour un type de valeur donné, c'est-à-dire que les valeurs de ce type peuvent y être écrites et qu'il peut être pré-incrémenté et post-incrémenté
(concept) |
| Bibliothèque d'itérateurs | fournit des définitions pour les itérateurs, les traits d'itérateurs, les adaptateurs et les fonctions utilitaires |