Présentation et philosophie de la STL
Fait partie de la section Programmation Orientée Objet du Journey C++ de Coddy — leçon 70 sur 104.
La Standard Template Library (STL) est une collection de classes et de fonctions basées sur des modèles (templates) qui fournissent des structures de données et des algorithmes courants. S'appuyant sur les concepts de modèles que vous avez appris, la STL incarne une philosophie de conception puissante : séparer le stockage des données de la manipulation des données.
La STL est organisée autour de trois composants principaux qui fonctionnent ensemble :
| Composant | Objectif | Exemples |
|---|---|---|
| Conteneurs | Stocker des collections d'objets | vector, map, set |
| Itérateurs | Fournir un accès aux éléments du conteneur | Entrée, sortie, accès aléatoire |
| Algorithmes | Effectuer des opérations sur les données | sort, find, transform |
L'idée fondamentale est que les algorithmes ne connaissent pas directement les conteneurs - ils fonctionnent via des itérateurs. Cela signifie qu'un seul algorithme sort fonctionne avec des vecteurs, des tableaux et tout conteneur fournissant le type d'itérateur approprié :
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
std::sort(nums.begin(), nums.end());
for (int n : nums) {
std::cout << n << " ";
}
// Sortie : 1 2 5 8 9
}Cette séparation signifie que vous pouvez combiner et assortir : utilisez n'importe quel algorithme avec n'importe quel conteneur compatible sans écrire de nouveau code. La STL fournit des implémentations éprouvées et optimisées afin que vous puissiez vous concentrer sur la résolution de problèmes plutôt que de réinventer des structures de données courantes.
Défi
FacileConstruisons un système simple de traitement de données qui démontre la philosophie de la STL consistant à séparer les conteneurs, les itérateurs et les algorithmes. Vous allez créer un module utilitaire qui fonctionne avec les composants de la STL et un programme principal qui montre comment ces pièces s'assemblent.
Vous allez créer deux fichiers :
DataProcessor.h: Définissez des fonctions utilitaires qui travaillent avec des conteneurs STL via des itérateurs, démontrant ainsi la philosophie de conception de la STL.Créez une fonction appelée
printVectorqui prend unstd::vector<int>&et affiche tous les éléments séparés par des espaces, suivis d'un saut de ligne. Utilisez des itérateurs (begin()etend()) pour parcourir le conteneur.Créez une fonction appelée
sortAndPrintqui prend unstd::vector<int>&, le trie en utilisantstd::sort, puis affiche les éléments triés séparés par des espaces suivis d'un saut de ligne.Créez une fonction appelée
findElementqui prend unstd::vector<int>&et une valeurintà rechercher. Utilisezstd::findpour localiser l'élément. S'il est trouvé, affichezFound: <value>. S'il n'est pas trouvé, affichezNot found: <value>.Créez une fonction appelée
getSumqui prend unstd::vector<int>&et retourne la somme de tous les éléments. Vous pouvez utiliser une boucle simple avec des itérateurs pour cela.main.cpp: Lisez les entrées et démontrez comment les composants de la STL fonctionnent ensemble.Lisez cinq entrées (chacune sur une ligne séparée) :
- Premier entier
- Deuxième entier
- Troisième entier
- Quatrième entier
- Une valeur à rechercher
Créez un
std::vector<int>et ajoutez-y les quatre premiers entiers. Ensuite, démontrez la philosophie de la STL en :- Affichant
Original:suivi de l'appel àprintVector - Affichant
Sorted:suivi de l'appel àsortAndPrint - Appelant
findElementavec la valeur de recherche - Affichant
Sum: <result>en utilisantgetSum
Par exemple, avec les entrées 5, 2, 8, 1, et 8 :
Original: 5 2 8 1
Sorted: 1 2 5 8
Found: 8
Sum: 16Avec les entrées 10, 30, 20, 40, et 15 :
Original: 10 30 20 40
Sorted: 10 20 30 40
Not found: 15
Sum: 100Remarquez comment vos fonctions travaillent avec le vecteur via des itérateurs, et comment std::sort et std::find opèrent sur n'importe quel conteneur qui fournit le bon type d'itérateur. C'est la force de la conception de la STL — les algorithmes sont découplés des conteneurs, connectés uniquement par des itérateurs.
Aide-mémoire
La Standard Template Library (STL) est une collection de classes et de fonctions basées sur des modèles (templates) fournissant des structures de données et des algorithmes courants. Elle sépare le stockage des données de leur manipulation.
La STL comporte trois composants principaux :
| Composant | Objectif | Exemples |
|---|---|---|
| Conteneurs | Stocker des collections d'objets | vector, map, set |
| Itérateurs | Fournir un accès aux éléments du conteneur | Entrée, sortie, accès aléatoire |
| Algorithmes | Effectuer des opérations sur les données | sort, find, transform |
Les algorithmes fonctionnent via des itérateurs, et non directement avec les conteneurs. Cela permet à un seul algorithme de fonctionner avec n'importe quel conteneur compatible :
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
// Trier en utilisant des itérateurs
std::sort(nums.begin(), nums.end());
// Parcourir en utilisant des itérateurs
for (int n : nums) {
std::cout << n << " ";
}
// Sortie : 1 2 5 8 9
}Méthodes d'itérateur courantes :
begin()- retourne un itérateur sur le premier élémentend()- retourne un itérateur sur la position après le dernier élément
Algorithmes STL courants :
std::sort(begin, end)- trie les éléments dans une plagestd::find(begin, end, value)- recherche une valeur dans une plage
Essayez vous-même
#include <iostream>
#include <vector>
#include "DataProcessor.h"
using namespace std;
int main() {
// Lire cinq entiers à partir de l'entrée
int num1, num2, num3, num4, searchValue;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> num4;
cin >> searchValue;
// TODO: Créer un vector et y ajouter les quatre premiers entiers
// TODO: Afficher "Original: " et appeler printVector
// TODO: Afficher "Sorted: " et appeler sortAndPrint
// TODO: Appeler findElement avec la valeur de recherche
// TODO: Afficher "Sum: " suivi du résultat de getSum
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