Les itérateurs en C++ - définition, déclaration et exemples

23 Nov 2021 23 Nov 2021 7486 vues ESSADDOUKI Mostafa 7 min de lecture
Introduction et syntaxe de base
1 Introduction au langage C++ 2 Entrée-sortie en C++ - cin et cout 3 Inférence de type avec le mot-clé auto en C++ 4 Classe std::string et les chaînes de caractères en C++ 5 Les structures conditionnelles (if et switch) en C++ (C++17 et C++20) 6 Les boucles en C++ (C++17 et C++20) 7 La gestion des fichiers en C++
Pointeurs et fonctions
8 Introduction aux pointeurs en C++ - Déclaration et interêts 9 Les références en C++ - déclaration et interêts 10 Les tableaux en C++ - Déclaration et interêts 11 Introduction aux fonctions en C++ 12 Passer des arguments à une fonction en C++ 13 Déclarer un paramètre const en C++ 14 Les fonctions Lambda en C++ 15 Fonctions utiles (Mathématiques et caractères) en C++
Programmation OO
16 Classes et objets en C++ 17 Spécificateurs d'accès en C++ 18 Constructeurs et destructeur d'une classe en C++ 19 Fonctions membres en C++ 20 Membres statiques d'une classe en C++ 21 Fonctions en ligne en C++ - inline 22 Fonctions et classes amies en C++ - friend 23 Surcharge des fonctions en C++ 24 Surcharge des opérateurs en C++ 25 Héritage en C++ 26 La gestion d'exceptions en C++ : déclaration, utilisation et personnalisation 27 fonctions et classes templates en C++ 28 Les nouveautés C++20 pour améliorer les templates en C++
Structures de données
29 Introduction aux structures de données 30 Les structures en C++ et la différence avec les structures en C 31 Les listes chaînées en C++ 32 Les piles en C++ 33 File d'attente en C++ 34 Arbre binaire de recherche : définition et mise en oeuvre en C++
La bibliothèque standard (STL)
35 Introduction à la bibliothèque de Template Standard STL 36 Les itérateurs en C++ - définition, déclaration et exemples 37 La classe array en C++ (bibliothèque STL) <array> 38 La classe vector de la bibliothèque STL <vector> 39 La classe deque en C++ ( Bibliothèque STL) 40 La classe list en C++ (bibliothèque STL) <list> 41 La classe stack (Pile) en C++ (bibliothèque STL) <stack> 42 La classe queue (File d'attente) en C++ (bibliothèque STL) <queue> 43 La file d'attente prioritaire (classe priority_queue) - Bibliothèque STL 44 Les ensembles en C++ (Classe set <set> - Bibliothèque STL) 45 Les dictionnaires en C++ : Classe map (Bibliothèque STL) 46 Introduction aux algorithmes de la bibliothèque STL (programmation compétitive) 47 Tri et méthodes associées en C++ - Bibliothèque STL 48 Recherche dichotomique et méthodes associées en C++ - Bibliothèque STL 49 Appliquer un prédicat ou une fonction aux éléments d'une séquence en C++ - Bibliothèque STL 50 Recherche dans une séquence et méthodes associées en C++ - Bibliothèque STL

Un itérateur est une abstraction d'un pointeur. Il est utilisé pour parcourir les éléments d'un conteneur, un processus appelé itération. Contrairement à un pointeur brut, un itérateur est une classe disposant d'opérations prédéfinies et contrôlées.

Itérateur

Un itérateur est une classe possédant un pointeur comme donnée membre et des opérateurs prédéfinis. Il permet de contrôler les opérations autorisées : on peut définir un itérateur qui avance seulement (++ sans --), ou qui lit sans écrire, ou inversement.

Avantage sur le pointeur brut

Un itérateur peut masquer la structure interne du conteneur. L'utilisateur crée un objet de type itérateur et accède aux éléments sans connaître les détails d'implémentation.

Types d'itérateurs

Les itérateurs sont classés en cinq catégories, selon les opérations qu'ils supportent :

Itérateur d'entrée

Un itérateur d'entrée peut utiliser l'opérateur de déréférencement uniquement pour lire depuis un conteneur. Il traite le conteneur comme une source de données.

Itérateur de sortie

Un itérateur de sortie peut utiliser l'opérateur de déréférencement uniquement pour écrire dans un conteneur. La lecture n'est pas autorisée.

Itérateur avant

Un itérateur avant peut lire et écrire. Il combine les capacités des itérateurs d'entrée et de sortie, mais ne se déplace qu'en avant.

Itérateur bidirectionnel

Un itérateur bidirectionnel peut se déplacer dans les deux sens. Les opérateurs ++ et -- sont tous les deux définis.

Itérateur à accès aléatoire

L'itérateur le plus puissant. Il supporte en plus les opérateurs +, - et les quatre opérateurs relationnels (<, <=, >, >=), ce qui permet l'utilisation de l'opérateur d'index [].

ItérateurMouvementLectureÉcriture*++--== et !=<, <=, >, >=+ et -
EntréeEn avant 
  
 

SortieEn avant
   
 

AvantEn avant    
 

BidirectionnelAvant et arrière      

Accès aléatoireAvant et arrière        

Un conteneur définit normalement deux catégories d'itérateurs : régulier (iterator) et inverse (reverse_iterator). Dans un itérateur régulier, ++ avance vers la fin ; dans un inverse, ++ avance vers le début.

Fournisseurs d'itérateurs

ItérateurFournisseur (classe)
Itérateur d'entréeistream
Itérateur de sortieostream
Itérateur avant
Itérateur bidirectionnellist, set, multiset, map, multimap
Itérateur à accès aléatoirevector, deque, array

Opérations sur les itérateurs

Les classes conteneurs fournissent plusieurs opérations pour manipuler les itérateurs, définies dans l'en-tête <iterator>.

begin / end

begin() renvoie un itérateur pointant sur le premier élément. end() renvoie un itérateur pointant sur l'élément après le dernier (sentinelle de fin de parcours).

  Exemple n°1 — Parcours avec begin() et end()

#include <iostream>
#include <string>
#include <iterator>
#include <vector>
using namespace std;

int main() {
    vector<string> jrs = {"Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"};

    cout << "Le premier element est : " << *std::begin(jrs) << '\n';

    vector<string>::iterator it;
    cout << "Les jours par begin() et end() :" << endl;
    for (it = std::begin(jrs); it < std::end(jrs); it++)
        cout << *it << " \t";
    return 0;
}
Sortie
Le premier element est : Lundi
Les jours par begin() et end() :
Lundi   Mardi   Mercredi   Jeudi   Vendredi   Samedi   Dimanche

advance

advance(it, n) déplace l'itérateur it de n positions. Pour un itérateur à accès aléatoire, il utilise l'opérateur + en une seule opération ; sinon il applique ++ répétitivement.

  Exemple n°2 — advance

vector<string> jrs = {"Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"};

vector<string>::iterator it = std::begin(jrs);
std::advance(it, 3);
cout << "La position apres avoir avance de 3 : " << *it;
Sortie
La position apres avoir avance de 3 : Jeudi

next / prev

next(it, n) renvoie un itérateur pointant n positions en avant, sans modifier it. prev(it, n) renvoie un itérateur n positions en arrière.

  Exemple n°3 — Parcours avec next() et prev()

vector<string>::iterator it = std::begin(jrs);

while (it < std::end(jrs)) {
    cout << *it << '\t';
    it = std::next(it);
}
cout << '\n';

cout << "ordre inverse :" << endl;
it = std::prev(std::end(jrs), 1);
while (it > std::begin(jrs)) {
    cout << *it << '\t';
    it = std::prev(it);
}
Sortie
Lundi   Mardi   Mercredi   Jeudi   Vendredi   Samedi   Dimanche
ordre inverse :
Dimanche   Samedi   Vendredi   Jeudi   Mercredi   Mardi

  Exemple n°4 — Accès au 4ème et avant-dernier éléments

it = std::begin(jrs);
cout << "4eme element : " << *std::next(it, 3) << '\n';

it = std::end(jrs);
cout << "Avant dernier element : " << *std::prev(it, 2);
Sortie
4eme element : Jeudi
Avant dernier element : Samedi

distance

distance(debut, fin) renvoie le nombre d'éléments entre deux itérateurs.

  Exemple n°5 — distance

vector<string>::iterator debut = jrs.begin();
vector<string>::iterator fin   = jrs.end();
cout << "Distance entre begin et end : " << std::distance(debut, fin);
Sortie
Distance entre begin et end : 7

Itérateur à accès aléatoire

Pour un itérateur à accès aléatoire (fourni par vector, deque...), les opérateurs + et - permettent un déplacement direct sans boucle.

  Exemple n°6 — Déplacement par arithmétique directe

vector<string>::iterator it = jrs.begin();
cout << "deplacement de 3 pas : " << *(it + 3) << '\n';

it = jrs.end();
cout << "3 pas depuis la fin : " << *(it - 3);
Sortie
deplacement de 3 pas : Jeudi
3 pas depuis la fin : Vendredi
Résumé des opérations

begin() et end() délimitent le conteneur. advance() modifie l'itérateur en place. next() et prev() renvoient un nouvel itérateur sans modifier l'original. distance() calcule l'écart entre deux itérateurs.

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.