Guide du débutant sur la bibliothèque de modèles standard en C++

C++ est l'un des langages de programmation les plus puissants et les plus intimidants que vous puissiez rencontrer en tant que débutant. La raison est assez simple. Il faut beaucoup de code pour obtenir le résultat souhaité. La bibliothèque de modèles standard, ou STL, peut vous aider à résoudre cette énigme.

Compte tenu du temps et des efforts consacrés à l'écriture de code pour des fonctions telles que le tri et la recherche, STL peut vous aider à effectuer toutes ces opérations avec une seule ligne de code. Cette bibliothèque peut être extrêmement utile pour la résolution de problèmes et la préparation d'entretiens techniques.

Qu'est-ce que la bibliothèque de modèles standard ?

La bibliothèque de modèles standard, ou STL, est une bibliothèque C++ qui se compose de fonctions et de conteneurs prédéfinis. Il comprend des classes de modèles importantes pour les structures de données courantes telles que les vecteurs, les piles, les files d'attente et certaines fonctions algorithmiques pratiques telles que la recherche binaire pour faciliter la programmation.

La bibliothèque de modèles standard en C++ se compose de quatre composants :

  1. Algorithmes
  2. Conteneurs
  3. Les fonctions
  4. Itérateurs

Examinons plus en détail les algorithmes et les conteneurs, car ce sont les composants les plus couramment utilisés de la STL.

Algorithmes en STL

Le fichier d'en-tête <algorithm> est une partie de la STL qui se compose de plusieurs fonctions algorithmiques qui peuvent être utilisées au lieu de les coder manuellement. Certains des algorithmes inclus sont la recherche binaire, le tri et l'inversion, qui sont extrêmement utiles.

Pour commencer, vous devez importer l' en- tête <algorithm> dans votre fichier C++. La syntaxe est la suivante :

 #include <algorithm>

Pour les méthodes à venir, considérons une variable de tableau avec les valeurs de {6, 2, 9, 1, 4} comme exemple.

 int arr[] = {6, 2, 9, 1, 4};

sorte()

La fonction sort() vous aide à trier tous les éléments à l'intérieur de la structure de données spécifiée dans l'ordre croissant. Cette fonction prend deux paramètres : l'itérateur de départ et l'itérateur de fin.

Connexes : Introduction à l'algorithme de tri par fusion

Syntaxe:

 sort(start_iterator, end_iterator);

Voici un exemple rapide :

 sort(arr, arr+5);
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}

Production:

 1 2 4 6 9

sens inverse()

La fonction reverse() inverse l'ordre des éléments dans la structure de données spécifiée. Il accepte deux paramètres : l'itérateur de départ et l'itérateur de fin.

Syntaxe:

 reverse(start_iterator, end_iterator);

Voici un court exemple de la méthode ci-dessus :

 reverse(arr, arr+5);
for(int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}

Production:

 4 1 9 2 6

*min_element() et *max_element()

Les fonctions *max_element() et *min_element() renvoient respectivement la valeur maximale et minimale à l'intérieur de la structure de données spécifiée. Ces deux fonctions acceptent deux arguments : l'itérateur de début et l'itérateur de fin.

Syntaxe:

 *max_element(start_iterator, end_iterator);
*min_element(start_iterator, end_iterator);

Voyons quelles valeurs ces fonctions renvoient en les appelant sur le tableau d'exemple :

 cout << *max_element(arr, arr+5) << endl;
cout << *min_element(arr, arr+5) << endl;

Production:

 9
1

La méthode binary_search() est utilisée pour déterminer si la valeur spécifiée est présente ou non dans la structure de données. Il accepte trois arguments : l'itérateur de départ, l'itérateur de fin et la valeur que vous souhaitez rechercher.

La recherche binaire ne fonctionne que sur les structures de données triées. Par conséquent, vous devrez d'abord appeler la méthode sort() avant la méthode binary_search() .

Syntaxe:

 binary_search(start_iterator, end_iterator, value_to_find)

Voici une démonstration de cette méthode :

 sort(arr, arr+5);
binary_search(arr, arr+5, 2) ? cout << "Element found" : cout << "Element not found";
binary_search(arr, arr+5, 7) ? cout << "Element found" : cout << "Element not found";

Production:

 Element found
Element not found

compter()

La méthode count() renvoie le nombre d'occurrences de la valeur spécifiée dans la structure de données. Il prend trois arguments : l'itérateur de début, l'itérateur de fin et la valeur à compter.

Syntaxe:

 count(start_iterator, end_iterator, value_to_count);

Voici un exemple de cette méthode :

 cout << count(arr, arr+5, 2) << endl;

Production:

 1

Conteneurs en STL

Les conteneurs sont les structures de données qui stockent les objets et les données. Les vecteurs, les listes, les piles, les files d'attente, les ensembles et les cartes sont quelques-uns des exemples qui y stockent des données en fonction du type de données primitif spécifié. Vous pouvez utiliser ces conteneurs en important leurs en-têtes respectifs dans le fichier C++.

Lors de l'initialisation de la variable de conteneur, vous devez mentionner les données primitives telles que int , char , string à l'intérieur des crochets <> .

Explorons certains de ces conteneurs plus en détail :

Vecteur

Les vecteurs sont des tableaux dynamiques redimensionnables et flexibles à utiliser. Lorsque vous insérez ou supprimez un élément du vecteur, il ajuste automatiquement la taille du vecteur. Ceci est similaire à la structure de données ArrayList en Java.

Syntaxe:

 #include <vector>
vector<data_type> variable_name;

Voici quelques méthodes vectorielles importantes :

  1. push_back(value) : Cette méthode ajoute les données au vecteur.
  2. pop_back() : Cette méthode supprime le dernier élément du vecteur.
  3. insert(index, value) : cette méthode insère de nouveaux éléments avant l'élément à la position spécifiée.
  4. size() : Cette méthode renvoie la taille du vecteur.
  5. empty() : Cette méthode vérifie si le vecteur est vide ou non.
  6. front() : Cette méthode renvoie la première valeur du vecteur.
  7. back() : La méthode back renvoie la dernière valeur du vecteur.
  8. at(index) : Cette méthode renvoie la valeur à la position spécifiée.
  9. effacer(index) : La méthode d'effacement supprime des éléments de l'index donné.
  10. clear() : Cette méthode efface tous les éléments du vecteur.
 vector < int > v = { 23, 12, 56, 10 };
v.push_back(5);
v.push_back(25);
v.pop_back();
auto i = v.insert(v.begin() + 1, 7);
cout << "The size of the given vector " << v.size() << endl;
if (v.empty()) {
cout << "Vector is empty" << endl;
} else {
cout << "Vector is not empty" << endl;
}
cout << "Element at the first position is " << v.front() << endl;
cout << "Element at the last position is " << v.back() << endl;
cout << "Element at the given position is " << v.at(4) << endl;
v.erase(v.begin() + 1);
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}

Production:

 The size of the given vector 6
Vector is not empty
Element at the first position is 23
Element at the last position is 5
Element at the given position is 10
23 12 56 10 5

File d'attente

Dans la structure de données de file d'attente, les éléments sont insérés à l'arrière et supprimés à l'avant. Par conséquent, il suit l'approche FIFO ("premier entré, premier sorti").

Syntaxe:

 #include <queue>
queue<data_type> variable_name;

Voici quelques méthodes de file d'attente importantes :

  1. push(value ): Cette méthode ajoute des éléments à la file d'attente.
  2. pop() : Cette méthode supprime le premier élément de la file d'attente.
  3. size() : Cette méthode renvoie la taille de la file d'attente.
  4. front() : Cette méthode renvoie le premier élément de la file d'attente.
  5. back() : Cette méthode renvoie le dernier élément de la file d'attente.
 queue < int > q;
q.push(30);
q.push(40);
q.push(50);
q.push(60);
q.push(70);
cout << "The first element is " << q.front() << endl;
cout << "The last element is " << q.back() << endl;
cout << "The size of queue is " << q.size() << endl;
q.pop();
cout << "Printing all the elements of the Queue" << endl;
while (!q.empty()) {
cout << q.front() << " ";
q.pop();
}

Production:

 The first element is 30
The last element is 70
The size of the queue is 5
Printing all the elements of the Queue
40 50 60 70

Empiler

Les conteneurs empilables fonctionnent selon la méthode LIFO. LIFO signifie "dernier entré, premier sorti". Les données sont poussées et extraites de la même extrémité.

Syntaxe:

 #include <stack>
stack<data_type> variable_name;

Voici quelques méthodes de pile importantes :

  1. push(value ): Cette méthode pousse l'élément dans la pile.
  2. pop() : Cette méthode supprime l'élément supérieur de la pile.
  3. top() : Cette méthode renvoie la valeur du dernier élément entré dans la pile.
  4. size() : Cette méthode renvoie la taille de la pile.
  5. empty() : Cette méthode vérifie si la pile est vide ou non.
 stack < int > s;
s.push(30);
s.push(40);
s.push(50);
s.push(60);
cout << "The top of the stack contains " << s.top() << endl;
s.pop();
cout << "The top of the stack after performing pop operation: " << s.top() << endl;
cout << "Printing all elements of the stack" << endl;
while (!s.empty()) {
cout << s.top() << " ";
s.pop();
}

Production:

 The top of the stack contains 60
The top of the stack after performing pop operation: 50
Printing all elements of the stack
50 40 30

Ensemble

Les conteneurs d'ensembles sont utilisés pour contenir des valeurs uniques, et la valeur de l'élément ne peut pas être modifiée une fois qu'il est inséré dans l'ensemble. Tous les éléments de l'ensemble sont stockés de manière triée. Le conteneur set est similaire à la structure de données set en Python .

Syntaxe:

 #include <set>
set<data_type> variable_name;

Voici quelques méthodes d'ensemble importantes :

  1. insert(value) : Cette méthode insère des éléments dans l'ensemble.
  2. begin() : Cette méthode renvoie l'itérateur au premier élément de l'ensemble.
  3. end() : Cette méthode renvoie l'itérateur au dernier élément de l'ensemble.
  4. size() : Cette méthode renvoie la taille de l'ensemble.
  5. empty() : Cette méthode vérifie si l'ensemble est vide ou non.
  6. find(value) : Cette méthode renvoie l'itérateur à l'élément passé en paramètre. Si l'élément n'est pas trouvé, cette fonction renvoie l'itérateur à la fin de l'ensemble.
  7. effacer(valeur) : Cette méthode a supprimé l'élément spécifié de l'ensemble.
 set < int > s;
s.insert(20);
s.insert(30);
s.insert(40);
s.insert(50);
s.insert(60);
s.insert(60);
s.insert(60);
auto i = s.begin();
cout << "Element at the first position " << * i << endl;
cout << "The size of the set " << s.size() << endl;
s.find(20) != s.end() ? cout << "Element found" << endl : cout << "Element not found" << endl;
s.erase(30);
cout << "Printing all the elements" << endl;
for (auto i = s.begin(); i != s.end(); i++) {
cout << * i << " ";
}

Production:

 Element at the first position 20
The size of the set 5
Element found
Printing all the elements
20 40 50 60

C++ n'a pas besoin d'être difficile

Comme toutes les autres compétences, la pratique est essentielle pour tirer le meilleur parti de la STL. Ces conteneurs et algorithmes peuvent vous faire gagner beaucoup de temps et sont faciles à utiliser. Commencez par pratiquer les exemples ci-dessus et vous finirez par l'utiliser également dans vos propres projets.

Cependant, si c'est la première fois que vous apprenez le C++, commencez par apprendre les bases avant de commencer à comprendre la STL.