Vidéo: Writing 2D Games in C using SDL by Thomas Lively 2024
Le programmeur C ++ parcourt un tableau en fournissant l'index de chaque élément. Cependant, cette technique ne fonctionne pas pour les conteneurs list qui n'autorisent pas l'accès aléatoire. On pourrait imaginer une solution basée sur des méthodes telles que getFirst () et getNext () ; Cependant, les concepteurs de la bibliothèque de modèles standard voulaient fournir une méthode commune pour traverser n'importe quel type de conteneur.
Pour cela, la bibliothèque de modèles standard définit l'itérateur.
Un itérateur est un objet qui pointe vers les membres d'un conteneur. En général, chaque itérateur supporte les fonctions suivantes:
-
Une classe peut retourner un itérateur qui pointe vers le premier membre de la collection.
-
L'itérateur peut être déplacé d'un membre à l'autre.
-
L'itérateur renvoie une indication lorsqu'il atteint la fin de la liste.
-
Le programme peut récupérer l'élément pointé par l'itérateur.
La bibliothèque de modèles standard fournit également des itérateurs inversés pour revenir en arrière dans les listes. Tout ce qui concerne les itérateurs s'applique également aux itérateurs inversés.
Le code nécessaire pour parcourir une liste est différent de celui nécessaire pour parcourir un vecteur (pour ne citer que deux exemples). Cependant, l'itérateur cache ces détails.
La méthode begin () renvoie un itérateur qui pointe sur le premier élément d'une liste. L'opérateur d'indirection * () récupère une référence à l'objet pointé par l'itérateur. L'opérateur ++ déplace l'itérateur vers l'élément suivant de la liste.
Un programme continue d'incrémenter la liste jusqu'à ce que l'itérateur soit égal à la valeur renvoyée par end () . L'extrait de code suivant commence au début d'une liste d'étudiants et affiche chacun de leurs noms:
void displayStudents (list & students) {// allouer un itérateur pointant vers le // premier élément de la liste:: itérateur iter = étudiants. commencer(); // continue de parcourir la liste jusqu'à ce que // l'itérateur atteigne la fin de la liste while (iter! = students. end ()) {// récupère l'étudiant les points de l'itérateur sur Student & s = * iter; cout << s. sName << endl; // déplace maintenant l'itérateur sur l'élément suivant // dans la liste itéra ++;}}
Les déclarations pour les itérateurs peuvent devenir très complexes. Ceci est probablement la meilleure justification pour la déclaration auto introduite avec la norme '11:
pour (auto iter = students. Begin (); iter! = Students.fin (); iter ++) {coutCeci déclare qu'il est un itérateur de tout type retourné par la liste de méthodes:: begin () , évitant les déclarations torturées montrées dans l'extrait de code précédent.À quel point cela est cool!