Namespaces
Variants

C++ named requirements: LegacyOutputIterator

From cppreference.net
C++ named requirements

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

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

* 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

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