Menu
Coddy logo textTech

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
}
challenge icon

Défi

Facile

Construisons 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 classe Inventory qui gère une collection de quantités d'éléments stockées dans un std::vector<int>.

    Ta classe doit fournir les méthodes suivantes :

    • addItem(int quantity) : ajoute la quantité d'un élément à l'inventaire
    • printForward() : utilise des itérateurs avec begin() et end() pour afficher toutes les quantités séparées par des espaces, suivies d'un retour à la ligne
    • printReverse() : utilise des itérateurs inverses avec rbegin() et rend() pour afficher toutes les quantités dans l'ordre inverse, séparées par des espaces, suivies d'un retour à la ligne
    • doubleAll() : utilise des itérateurs pour parcourir le vecteur et doubler chaque quantité sur place
    • getTotal() : utilise des itérateurs pour calculer et renvoyer la somme de toutes les quantités

    Utilise le mot-clé auto pour 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 Inventory et ajoute les quatre quantités. Démontre ensuite l'utilisation des itérateurs en :

    1. affichant Forward:, puis en appelant printForward()
    2. affichant Reverse:, puis en appelant printReverse()
    3. affichant Total: <sum> à l'aide de getTotal()
    4. appelant doubleAll() pour modifier les quantités
    5. affichant After doubling:, puis en appelant printForward()
    6. affichant New total: <sum> à l'aide de getTotal()

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: 160

Ce 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;
}
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur C++ en ligne