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 d’intermédiaire entre les conteneurs et les algorithmes. Ils offrent une manière uniforme d’accéder aux éléments de n’importe quel conteneur, quelle que soit 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 se déplacer dans 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 indique 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 se répartissent en différentes catégories selon leurs capacités. Les itérateurs à accès aléatoire (comme ceux de vector) prennent en charge des opérations arithmétiques telles que it + 3 ou it1 - it2.
Les itérateurs bidirectionnels (de list, map) peuvent avancer et reculer avec ++ et --. Les itérateurs en avant ne peuvent se déplacer que dans une seule direction.
Pour le parcours en sens 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'éléments. Tu vas t'entraîner à utiliser différents types d'itérateurs pour parcourir les données de diverses manières.
Tu organiseras ton code sur deux fichiers :
Inventory.h: définis une classeInventoryqui gère une collection de quantités d'éléments stockées dans unstd::vector<int>.Ta classe doit fournir les méthodes suivantes :
addItem(int quantity): ajoute la quantité d'un élément à l'inventaireprintForward(): utilise des itérateurs avecbegin()etend()pour afficher toutes les quantités séparées par des espaces, suivies d'un retour à la 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 retour à la lignedoubleAll(): utilise des itérateurs pour parcourir le vecteur et doubler chaque quantité sur placegetTotal(): utilise des itérateurs pour calculer et renvoyer la somme de toutes les quantités
Utilise le mot-clé
autopour les déclarations de tes itérateurs afin de garder un code propre.main.cpp: lis quatre entrées entières, chacune sur une ligne distincte, représentant les quantités des éléments.Crée un
Inventoryet ajoute les quatre quantités. Démontre ensuite l'utilisation des itérateurs en :- affichant
Forward:, puis en appelantprintForward() - affichant
Reverse:, puis en appelantprintReverse() - affichant
Total: <sum>à l'aide degetTotal() - appelant
doubleAll()pour modifier les quantités - affichant
After doubling:, puis en appelantprintForward() - affichant
New total: <sum>à l'aide degetTotal()
- 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 te permet de t'entraîner à la fois à lire des éléments à l'aide d'itérateurs (pour les afficher et calculer leur somme) et à modifier des éléments à l'aide d'itérateurs (pour les doubler). Tu verras également comment les itérateurs inverses rendent le parcours en arrière simple, sans aucune manipulation d'index.
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: Afficher "Forward: " puis appeler printForward()
// TODO: Afficher "Reverse: " puis appeler printReverse()
// TODO: Afficher "Total: " suivi du résultat de getTotal()
// TODO: Appeler doubleAll() pour modifier les quantités
// TODO: Print "After doubling: " then call printForward()
// TODO: Afficher "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 externesGénération et compilation en C++Fichiers d’en-tête et fichiers sourceEspaces de noms et portéeIntroduction à la POO en C++Classes et objetsLe pointeur « this »Méthodes (fonctions membres)Attributs (membres de données)Bases des constructeurs et destructeursRécapitulatif - Calculatrice simple4Propriétés de classe
Membres d’instance et statiquesAccesseurs et mutateursFonctions membres constMot-clé mutableMéthodes et variables statiquesFonctions et classes amiesRécapitulatif - Gestionnaire de compte bancaire7Héritage
Héritage de baseNiveaux d’accès de l’héritageOrdre d’appel des constructeurs et destructeursRedéfinition des méthodesFonctions virtuelles et VTableHéritage multipleHéritage virtuelRécapitulatif : hiérarchie des employés10Vue d’ensemble de la STL
Vue d’ensemble et philosophie de la STLConteneurs de la STLItérateursAlgorithmes de la STLFoncteurs et expressions lambdaRécapitulatif - fréquence des mots13Modèles de conception, partie 1
Introduction aux modèles de conceptionModèle SingletonFabrique et fabrique abstraiteModèle BuilderModèle ObserverModèle Strategy2Gestion de la mémoire
Mémoire de pile ou de tasPointeurs et référencesMémoire dynamique (new/delete)Pointeurs intelligents 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 de l’informationStruct vs classeClasses imbriquées et internesRécapitulatif - Système de gestion des dossiers étudiants8Polymorphisme
Polymorphisme à la compilation vs à l’exécutionSurcharge de fonctionsRetour sur les fonctions virtuellesFonctions virtuelles puresClasses abstraitesConception d’interfaces en C++Conversion dynamique et RTTIRécapitulatif - Calculateur de formes3Constructeurs et destructeurs
Constructeur par défautConstructeur paramétréConstructeur de copieConstructeur de déplacementListes d’initialisation des constructeursConstructeurs déléguésApprofondissement des destructeursRègle des trois / cinq / zéroRécapitulatif - Classe String6Surcharge des opérateurs
Introduction à la surcharge des 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 des templatesTemplates variadiquesBases de SFINAE et des traits de typesRécapitulatif - Conteneur génériqueEntraînez-vous par vous-même : Compilateur C++ en ligne