Itérateurs
Fait partie de la section Programmation Orientée Objet du Journey C++ de Coddy — leçon 72 sur 104.
Les itérateurs sont des objets qui servent de pont entre les conteneurs et les algorithmes. Ils offrent une manière uniforme d'accéder aux éléments de n'importe quel conteneur, indépendamment de la façon dont ce conteneur stocke ses données en interne. Considérez un itérateur comme un pointeur généralisé qui sait comment parcourir un conteneur.
Chaque conteneur STL fournit les méthodes begin() et end(). L'itérateur begin() pointe vers le premier élément, tandis que end() pointe juste après le dernier élément — une sentinelle qui marque l'endroit où s'arrêter :
#include <vector>
#include <iostream>
int main() {
std::vector<int> nums = {10, 20, 30};
for (std::vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) {
std::cout << *it << " "; // Déréférencer pour obtenir la valeur
}
// Sortie : 10 20 30
}Le mot-clé auto simplifie considérablement les déclarations d'itérateurs :
for (auto it = nums.begin(); it != nums.end(); ++it) {
*it *= 2; // Modifier les éléments via l'itérateur
}
// nums est maintenant {20, 40, 60}Les itérateurs sont classés en différentes catégories selon leurs capacités. Les itérateurs à accès aléatoire (comme ceux de vector) prennent en charge les opérations arithmétiques telles que it + 3 ou it1 - it2.
Les itérateurs bidirectionnels (provenant de list, map) peuvent se déplacer vers l'avant et vers l'arrière avec ++ et --. Les itérateurs unidirectionnels ne peuvent se déplacer que dans une seule direction.
Pour le parcours inverse, utilisez rbegin() et rend() :
for (auto rit = nums.rbegin(); rit != nums.rend(); ++rit) {
std::cout << *rit << " "; // Affiche dans l'ordre inverse
}Défi
FacileConstruisons un système de suivi d'inventaire qui utilise des itérateurs pour parcourir et manipuler des collections d'articles. Vous vous entraînerez à utiliser différents types d'itérateurs pour naviguer dans les données de diverses manières.
Vous organiserez votre code sur deux fichiers :
Inventory.h: Définissez une classeInventoryqui gère une collection de quantités d'articles stockées dans unstd::vector<int>.Votre classe doit fournir ces méthodes :
addItem(int quantity)— ajoute une quantité d'article à l'inventaireprintForward()— utilise des itérateurs avecbegin()etend()pour afficher toutes les quantités séparées par des espaces, suivies d'un saut de ligneprintReverse()— utilise des itérateurs inverses avecrbegin()etrend()pour afficher toutes les quantités dans l'ordre inverse, séparées par des espaces, suivies d'un saut de lignedoubleAll()— utilise des itérateurs pour parcourir le vecteur et doubler chaque quantité sur placegetTotal()— utilise des itérateurs pour calculer et retourner la somme de toutes les quantités
Utilisez le mot-clé
autopour vos déclarations d'itérateurs afin de garder le code propre.main.cpp: Lit quatre entrées entières (chacune sur une ligne séparée) représentant les quantités d'articles.Créez un
Inventoryet ajoutez les quatre quantités. Ensuite, démontrez l'utilisation des itérateurs en :- Affichant
Forward:suivi de l'appel àprintForward() - Affichant
Reverse:suivi de l'appel àprintReverse() - Affichant
Total: <sum>en utilisantgetTotal() - Appelant
doubleAll()pour modifier les quantités - Affichant
After doubling:suivi de l'appel àprintForward() - Affichant
New total: <sum>en utilisantgetTotal()
- Affichant
Par exemple, avec les entrées 10, 25, 15, et 30 :
Forward: 10 25 15 30
Reverse: 30 15 25 10
Total: 80
After doubling: 20 50 30 60
New total: 160Ce défi vous permet de pratiquer à la fois la lecture d'éléments via des itérateurs (pour l'affichage et la somme) et la modification d'éléments via des itérateurs (pour le doublage). Vous verrez également comment les itérateurs inverses facilitent le parcours à l'envers sans aucune manipulation d'index.
Aide-mémoire
Les itérateurs sont des objets qui fournissent un moyen uniforme d'accéder aux éléments dans des conteneurs. Ils agissent comme des pointeurs généralisés qui savent comment se déplacer à travers un conteneur.
Chaque conteneur STL fournit des méthodes begin() et end(). L'itérateur begin() pointe vers le premier élément, tandis que end() pointe juste après le dernier élément :
std::vector<int> nums = {10, 20, 30};
for (std::vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) {
std::cout << *it << " "; // Déréférencer pour obtenir la valeur
}Utilisez le mot-clé auto pour simplifier les déclarations d'itérateurs :
for (auto it = nums.begin(); it != nums.end(); ++it) {
*it *= 2; // Modifier les éléments via l'itérateur
}Catégories d'itérateurs basées sur leurs capacités :
- Les itérateurs à accès aléatoire (par exemple,
vector) prennent en charge les opérations arithmétiques commeit + 3ouit1 - it2 - Les itérateurs bidirectionnels (par exemple,
list,map) peuvent se déplacer vers l'avant et vers l'arrière avec++et-- - Les itérateurs vers l'avant ne peuvent se déplacer que dans une seule direction
Pour un parcours inverse, utilisez rbegin() et rend() :
for (auto rit = nums.rbegin(); rit != nums.rend(); ++rit) {
std::cout << *rit << " "; // Affiche dans l'ordre inverse
}Essayez vous-même
#include <iostream>
#include "Inventory.h"
using namespace std;
int main() {
// Lire quatre entrées entières
int q1, q2, q3, q4;
cin >> q1;
cin >> q2;
cin >> q3;
cin >> q4;
// TODO: Créer un objet Inventory
// TODO: Ajouter les quatre quantités à l'inventaire
// TODO: Imprimer "Forward: " puis appeler printForward()
// TODO: Imprimer "Reverse: " puis appeler printReverse()
// TODO: Imprimer "Total: " suivi du résultat de getTotal()
// TODO: Appeler doubleAll() pour modifier les quantités
// TODO: Imprimer "After doubling: " puis appeler printForward()
// TODO: Imprimer "New total: " suivi du résultat de getTotal()
return 0;
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesBuild et Compilation C++Fichiers d'en-tête et Fichiers sourceEspaces de noms et PortéeIntroduction à la POO en C++Classes vs ObjetsLe pointeur 'this'Méthodes (Fonctions membres)Attributs (Membres de données)Bases des Ctors et DtorsRécapitulatif - Calculatrice simple4Propriétés de classe
Membres d'instance vs membres statiquesGetters et SettersFonctions membres constMot-clé mutableMéthodes et variables statiquesFonctions et classes amiesRécapitulatif - Gestionnaire de compte bancaire7Héritage
Héritage de baseNiveaux d'accès à l'héritageOrdre d'appel des Ctor et DtorRedéfinition de méthodesFonctions virtuelles et VTableHéritage multipleHéritage virtuelRécapitulatif - Hiérarchie des employés10Présentation de la STL
Présentation et philosophie de la STLConteneurs de la STLItérateursAlgorithmes de la STLFoncteurs et expressions lambdaRécapitulatif - Fréquence des mots13Patrons de conception, Partie 1
Introduction aux patrons de conceptionPatron SingletonFabrique & Fabrique abstraitePatron MonteurPatron ObservateurPatron Stratégie2Gestion de la mémoire
Mémoire Pile vs TasPointeurs et RéférencesMémoire dynamique (new/delete)Smart Pointers en C++RAII en C++Récapitulatif - Gestionnaire de tableaux dynamiques5Encapsulation
Spécificateurs d'accès en C++Spécificateurs d'accès en profondeurMasquage d'informationStruct vs ClassClasses imbriquées et internesRécapitulatif - Système de gestion d'étudiants8Polymorphisme
Polymorphisme : Compilation vs ExécutionSurcharge de fonctionsRetour sur les fonctions virtuellesFonctions virtuelles puresClasses abstraitesConception d'interfaces en C++Dynamic Casting & RTTIRécapitulatif - Calculateur de formes11Concepts avancés de la POO
Composition vs HéritageMixins via CRTPIdiome PimplEffacement de typeEnum Classes & Typage fortGestion des exceptions en POOHiérarchies d'exceptions personnalisées14Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositeRAII en tant que patron3Constructeurs et Destructeurs
Constructeur par défautConstructeur paramétréConstructeur de copieConstructeur de déplacementListes d'initialisation du constructeurConstructeurs déléguésAnalyse approfondie du destructeurRègle de trois / cinq / zéroRécapitulatif - Classe String6Surcharge d'opérateurs
Introduction à la surcharge d'opérateursSurcharge des opérateurs arithmétiquesSurcharge des opérateurs de comparaisonOpérateurs de fluxSurcharge de l'opérateur d'affectationSurcharge des opérateurs [] et ()Opérateurs de conversion de typeRécapitulatif - Classe Matrix9Templates
Templates de fonctionsTemplates de classesSpécialisation de templatesTemplates variadiquesBases de SFINAE & Type TraitsRécapitulatif - Conteneur générique