Nous utilisons des cookies pour améliorer votre expérience. En poursuivant votre navigation sur ce site, vous acceptez l'utilisation de cookies.


Politique de confidentialité
Introduction et syntaxe de base
Pointeurs et fonctions
Programmation OO
Structures de données
La bibliothèque standard (STL)

Introduction à la bibliothèque de Template Standard STL

 

Introduction à la bibliothèque de Template Standard STL

La bibliothèque de Template standard ou Standard Template Library en anglais (STL) est le résultat d'années de recherche visant à résoudre deux problèmes importants : la réutilisation des logiciels et la séparation des fonctionnalités.

La bibliothèque de Template standard (STL) se compose de trois éléments. Il s'agit des conteneurs, des algorithmes qui s'exécutent sur les conteneurs et des itérateurs qui les relient. Cette abstraction de la programmation générique vous permet de combiner les algorithmes et les conteneurs d'une manière unique. Les conteneurs n'ont que des exigences minimales pour leurs éléments.

Conteneurs

Les conteneurs sont le cœur de la STL. La bibliothèque définit quatre catégories de conteneurs, chacun pour un objectif différent : conteneurs de séquence, conteneurs associés, adaptateurs de conteneur et pseudo-conteneurs. Chaque catégorie de conteneur a été définie pour un groupe d'applications. Chaque conteneur de chaque catégorie est utilisé dans un but précis.

Conteneurs de séquences

Chacun des conteneurs de séquences a un domaine unique, mais dans la plupart des cas d'utilisation, std::vector est le bon choix. std::vector peut ajuster dynamiquement sa taille, gère automatiquement sa mémoire et vous offre des performances exceptionnelles. En revanche, std::array est le seul conteneur de séquence qui ne peut pas ajuster sa taille au moment de l'exécution. Il est optimisé pour une surcharge de mémoire et de performances minimale. Alors que std::vector est bon pour mettre de nouveaux éléments à sa fin, vous devez utiliser std::deque pour mettre un élément également au début. Avec std::list pour une liste à doublement chainée et std::forward_list pour une liste chainée simple, nous avons deux conteneurs supplémentaires qui sont optimisés pour les opérations à des positions arbitraires dans le conteneur, avec des performances élevées.

Conteneurs associatifs

Les conteneurs associatifs sont des conteneurs de paires clé-valeur. Ils fournissent leurs valeurs par leur clé respective. Un cas d'utilisation typique pour un conteneur associatif est un annuaire téléphonique, où vous utilisez le nom de famille de clé pour récupérer la valeur numéro de téléphone. C++ a huit conteneurs associatifs différents. D'un côté il y a les conteneurs associatifs avec des clés ordonnées : std::set, std::map, std::multiset et std::multimap. De l'autre côté il y a les conteneurs associatifs non ordonnés : std::unordered_set, std::unordered_map, std::unordered_multiset et std::unordered_multimap.

Adaptateurs de conteneurs

Les adaptateurs de conteneur fournissent une interface simplifiée aux conteneurs de séquence. C++ a std::stack, std::queue et std::priority_queue.

Algorithmes

Les algorithmes sont des opérations que nous appliquons aux éléments conteneurs. Ils sont divisés en quatre catégories : les algorithmes non mutants, qui ne modifient pas la structure du conteneur ; des algorithmes mutants, qui modifient la structure ; algorithmes de tri, qui réorganisent les éléments dans un conteneur ; et des algorithmes numériques, qui appliquent des opérations mathématiques aux éléments.

La STL vous propose plus de 100 algorithmes. En spécifiant la politique d'exécution, vous pouvez exécuter la plupart des algorithmes de manière séquentielle, parallèle ou parallèle et vectorisée.

Les algorithmes peuvent être utilisés dans un large éventail d'applications. Vous pouvez rechercher des éléments ou les compter, rechercher des plages, les comparer ou les transformer. Il existe des algorithmes pour générer, remplacer ou supprimer des éléments d'un conteneur. Bien entendu, vous pouvez trier, permuter ou partitionner un conteneur ou en déterminer l'élément minimum ou maximum.

Itérateurs

Des itérateurs sont utilisés pour connecter les conteneurs et les algorithmes. Le conteneur les crée. En tant que pointeurs généralisés, vous pouvez les utiliser pour itérer en avant et en arrière ou jusqu'à une position arbitraire dans le conteneur. Le type d'itérateur que vous obtenez dépend du conteneur. Si vous utilisez un adaptateur itérateur, vous pouvez accéder directement à un flux.

Un itérateur nous permet d'accéder à chaque élément individuellement et de lui appliquer l'opération souhaitée. Cela signifie que nous n'avons pas besoin d'un algorithme qui compte un type et un autre qui compte un autre type. Un algorithme peut être appliqué à n'importe quel conteneur qui fournit le type d'itérateurs pris en charge par le conteneur.

Utiliser la bibliothèque de Template standard

Pour utiliser une bibliothèque dans un fichier, vous devez effectuer trois étapes. Tout d'abord, vous devez inclure les fichiers d'en-tête avec l'instruction #include, afin que le compilateur connaisse les noms de la bibliothèque. Comme les noms de la bibliothèque standard C++ se trouvent dans l'espace de noms std, vous pouvez les utiliser dans la deuxième étape en utilisant le nom complet qualifié ou vous devez les importer dans l'espace de noms global. La troisième et dernière étape consiste à spécifier les bibliothèques pour que l'éditeur de liens puisse obtenir un exécutable. Cette troisième étape n'est souvent pas nécessaire.

Inclure les fichiers d'en-tête

Le préprocesseur inclut le fichier, à la suite de l'instruction #include. Il s'agit la plupart du temps d'un fichier d'en-tête. Les fichiers d'en-tête seront placés entre crochets :

#include <iostream>
#include <vector>
        
Le compilateur est libre d'ajouter des en-têtes supplémentaires aux fichiers d'en-tête. Il peut donc arriver que votre programme ait tous les en-têtes nécessaires bien que vous ne les ayez pas tous spécifiés. Il n'est pas recommandé de se fier à cette fonctionnalité. Tous les en-têtes nécessaires doivent toujours être explicitement spécifiés, sinon. une mise à jour du compilateur ou un portage de code peut provoquer une erreur de compilation.

Utilisation des espaces de noms

Si vous utilisez des noms qualifiés, vous devez les utiliser exactement comme définis. Pour chaque espace de nom, vous devez mettre l'opérateur de résolution de portée :: . D'autres bibliothèques de la bibliothèque standard C++ utilisent des espaces de noms imbriqués.

#include <iostream>
#include <chrono>
...
std::cout << "Hello world:" << std::endl;
auto timeNow= std::chrono::system_clock::now();
        
Utilisation des noms non qualifies

Vous pouvez utiliser des noms en C++ avec la déclaration using et la directive using.

déclaration using.

Une déclaration using ajoute un nom à la portée de visibilité, dans laquelle vous avez appliqué la déclaration using :

#include <iostream>
#include <chrono>
...
using std::cout;
using std::endl;
using std::chrono::system_clock;
...
cout << "Hello world :" << endl; // nom non qualifié (cout)
auto timeNow= now(); // nom non qualifié (now)
        

L'utilisation de la déclaration entraîne une recherche ambiguë et, par conséquent, une erreur de compilation se produit si le même nom a été déclaré dans la même portée de visibilité.

directive using.

La directive using permet d'utiliser tous les noms d'un espace de noms sans qualification.

#include <iostream>
#include <chrono>
...
using namespace std;
...
cout << "Hello world:" << endl; // nom non qualifié
auto timeNow= chrono::system_clock::now(); // nom partiellement qualifié
        

Une directive using n'ajoute aucun nom à la portée de visibilité actuelle, elle ne fait que rendre le nom accessible. Cela implique :

  •  Une recherche ambiguë et donc une erreur de compilation se produisent si le même nom a été déclaré dans la même portée de visibilité.
  •  Un nom dans l'espace de noms local masque un nom déclaré dans un espace de noms environnant.
  •  Une recherche ambiguë et donc une erreur de compilation se produisent si le même nom est visible à partir d'espaces de noms différents ou si un nom dans l'espace de noms masque un nom dans la portée globale.

Partager ce cours avec tes amis :
Rédigé par ESSADDOUKI Mostafa
ESSADDOUKI
The education of the 21st century opens up opportunities to not merely teach, but to coach, mentor, nurture and inspire.