Partager via


Itérateurs

Les fonctionnalités de STL font un usage fréquent des itérateurs pour négocier entre les différents algorithmes et les séquences sur lesquels ils agissent. Le nom d'un type d'itérateurs (ou son préfixe) indique la catégorie d'itérateurs requis pour ce type. Dans l'ordre croissant de remplissage, les catégories sont résumées ici comme suit :

  • Sortie. Un itérateur X de sortie ne peut admettre qu'une valeur V indirecte stockée sur lui, après quoi il doit être incrémenté avant le stockage suivant, comme dans un (*X++ = V), (*X = V, ++X), ou (*X = V, X++).

  • Entrée. Un itérateur d'entrée X peut représenter une valeur singulière qui indique la fin de la séquence. Si un itérateur d'entrée ne se compare de la même manière à la valeur de fin séquence, il peut voir une valeur V y accéder indirectement un nombre quelconque de fois, comme dans (V = *X). Pour progresser à la valeur suivante ou à la fin de la séquence, vous l'incrémentez, comme dans ++X, X++, ou (V = *X++). Une fois que vous incrémentez toute copie d'un itérateur d'entrée, aucune des autres sauvegardes ne peut enuite sans risque être comparée, déréférencée, ou incrémentée.

  • Vers l'avant. Un itérateur par progression X peut remplacer un itérateur de sortie pour écrire ou un itérateur d'entrée pour lire. Vous pouvez, toutefois, lire (par V = *)Xce que vous venez d'écrire (à travers le *X * = V) via un itérateur par progression. Vous pouvez également exécuter plusieurs copies d'un itérateur par progression, chacun d'entre eux pouvant être déréférencés et incrémentés indépendamment.

  • Bidirectionnel. Un itérateur bidirectionnel X peut remplacer un itérateur par progression. Vous pouvez, toutefois, également décrémenter un itérateur bidirectionnel, comme dans --X, X--, ou (V = *X--).

  • Accès aléatoire. Un itérateur l'accès aléatoire X peut remplacer un itérateur bidirectionnel. Il vous est également possible d'exécuter pratiquement la même arithmétique entière sur un itérateur d'accès aléatoire que ce qui vous est possible sur un pointeur d'objet. Pour N, un objet entier, il vous est possible d'écrire x[N], x + N, x - N, et N + X

Notez qu'un pointeur d'objet peut remplacer un itérateur à accès aléatoire ou tout autre itération. Tous les itérateurs peuvent être affectés ou copiées ensemble. Il est supposé qu'il s'agit d'objets légers et qui sont souvent passés et retournés par valeur, et non par référence. Notez également qu'aucune des opérations décrites précédemment ne peut lever une exception lorsqu'elle est effectuée sur un itérateur valide.

La hiérarchie des catégories d'itérateur peut être résumée en désignant trois séquences. Pour l'accès en écriture seule à une séquence, il vous est possible d'utiliser les suivantes :

output iterator
   -> forward iterator
   -> bidirectional iterator
   -> random-access iterator

Les méthodes de flèche droite « peuvent être remplacées par. » Tout algorithme qui demande un itérateur de sortie doit fonctionner correctement avec un itérateur par progression, par exemple, mais pas dans l'autre sens.

Pour l'accès en lecture seule à une séquence, il vous est possible d'utiliser les suivantes :

input iterator
   -> forward iterator
   -> bidirectional iterator
   -> random-access iterator

Un itérateur d'entrée est le plus faible de toutes les catégories, dans ce cas.

Finalement, pour l'accès en lecture ou en écriture à une séquence, il vous est possible d'utiliser les suivantes :

forward iterator
   -> bidirectional iterator
   -> random-access iterator

Un pointeur d'objet peut toujours servir d'itérateur à accès aléatoire, ainsi il peut servir de toute catégorie d'itérateur s'il prend en charge l'accès en lecture/écriture approprié pour la séquence qu'il pointe.

Un itérateur Iterator autre qu'un pointeur d'objet doit également définir les types de membres requis par la spécialisation iterator_traits<Iterator>. Notez que ces besoins peuvent être effectuées en Iterator en faisant dériver de la classe de base itérateurpublique.

Cet « algèbre » d'itérateurs est fondamentale à pratiquement tout le reste dans la bibliothèque de modèles standards. Il est important de comprendre les promesses et les limites de chaque catégorie d'itérateur afin de voir comment les itérateurs sont utilisés par les conteneurs et les algorithmes dans le STL.

Notes

Il vous est également possible d'utiliser pour chaque, dans pour parcourir les collections de STL.Pour plus d'informations, consultez Comment : Itérez au sein de la collection STL avec pour chaque.

Visual C++ offre maintenant des itérateurs extraits et des itérateurs de débogage pour vérifier que vous ne remplacez pas les limites du conteneur. Pour plus d’informations, consultez Itérateurs vérifiés et Itérateurs de débogage, prise en charge.

Voir aussi

Référence

Bibliothèque STL (Standard Template Library)

Sécurité des threads dans la bibliothèque standard C++