📦
Organiser ses donnéesLes conteneurs de la STL (Standard Template Library) permettent de stocker des collections d'éléments avec des performances et usages différents. Le plus utilisé est std::vector, un tableau dynamique contigu en mémoire offrant un accès direct par indice. Pour des insertions/suppressions fréquentes en tête, std::list (liste doublement chaînée) est plus adaptée. Les conteneurs associatifs comme std::map associent une clé à une valeur, pratique pour des dictionnaires. Choisir le bon conteneur dépend des opérations dominantes : accès, insertion, recherche.
📢 Rappel
Un tableau classique `int t[10]` a une taille fixe connue à la compilation, contrairement aux conteneurs STL dynamiques.
📖 Définition
Un conteneur STL est une structure de données générique qui gère automatiquement la mémoire de ses éléments.
🔍 Exemple
`std::vector<int> notes; notes.push_back(15);` ajoute la note 15 au vecteur.
💡 À retenir : std::vector est le tableau dynamique par défaut.
🔁
Parcourir les collectionsUn itérateur est un objet qui pointe sur un élément d'un conteneur et permet de se déplacer d'un élément à l'autre. Il généralise la notion de pointeur ou d'indice : on peut l'incrémenter avec ++, le déréférencer avec * et comparer à end(). Chaque conteneur fournit begin() et end() qui délimitent l'intervalle des éléments. Grâce aux itérateurs, les algorithmes STL fonctionnent sur tous les conteneurs de manière uniforme. On distingue plusieurs catégories : entrée, sortie, avant, bidirectionnel, accès aléatoire, selon les opérations supportées.
📖 Définition
Un itérateur est une abstraction de pointeur permettant de parcourir les éléments d'un conteneur.
🔍 Exemple
`for (auto it = v.begin(); it != v.end(); ++it) cout << *it;` affiche tous les éléments du vecteur v.
⭐ À retenir
`begin()` et `end()` définissent un intervalle semi-ouvert [begin, end[.
💡 À retenir : Un itérateur généralise la notion de pointeur pour parcourir un conteneur.
🧠
Opérations prêtes à l'emploiLa STL fournit plus d'une centaine d'algorithmes génériques opérant sur des plages d'itérateurs. std::sort trie un intervalle, std::find cherche une valeur, std::count compte les occurrences, std::accumulate calcule une somme. Ces algorithmes sont indépendants du type de conteneur : il suffit de fournir les itérateurs de début et de fin. Pour les utiliser, inclure <algorithm> et <numeric>. Ils évitent d'écrire des boucles manuelles, ce qui rend le code plus lisible et moins sujet aux erreurs.
🔍 Exemple
`std::sort(v.begin(), v.end());` trie le vecteur v par ordre croissant.
⭐ À retenir
Les algorithmes STL prennent des itérateurs et non des conteneurs entiers.
📢 Rappel
La complexité de `std::sort` est en O(n log n), celle de `std::find` en O(n).
💡 À retenir : Les algorithmes STL évitent d'écrire des boucles manuelles.
🚀
Un exemple completUn programme typique déclare un conteneur, le remplit, puis applique un algorithme via des itérateurs. Par exemple, pour lire des notes, les trier et afficher la meilleure, on utilise std::vector, std::sort et std::max_element. On peut aussi filtrer avec std::copy_if ou transformer avec std::transform. La STL favorise un style déclaratif : on décrit le résultat voulu plutôt que la boucle exacte. La maîtrise de ces trois piliers est essentielle pour écrire du C++ moderne efficace.
🔍 Exemple
`auto max_it = std::max_element(notes.begin(), notes.end());` renvoie un itérateur sur la note maximale.
⭐ À retenir
Combiner conteneur, itérateurs et algorithmes permet d'écrire un code générique, court et efficace.
💡 À retenir : Conteneur + itérateurs + algorithmes = code générique et efficace.