Programmation C++/La librairie standard
La STL.
La STL (Standard Template Library) a été mise au point par Alexander Stepanov et Meng Lee. La STL a été proposée au comité ISO de standardisation du C++ qui l'a acceptée en juillet 1994. Les résultats des travaux de recherche ont été publiés officiellement dans un rapport technique en novembre 1995. Ces travaux de recherche ont été une avancée majeure pour le C++, qui était aussi à l'époque le seul langage capable d'offrir les mécanismes de programmation générique nécessaires à la mise au point de cette bibliothèque. Elle a d'ailleurs influencé les autres parties de la future bibliothèque du C++ (notamment la future classe string) et aussi l'évolution du langage.
La STL est axée autour de trois grands thèmes :
La force de la STL réside dans le fait de pouvoir offrir des conteneurs pouvant accueillir n'importe quel type moyennant quelques contraintes sémantiques qui peuvent varier selon le type conteneur et surtout dans le fait que les algorithmes sont complètement découplés des conteneurs (même si certains conteneurs offrent parfois leur propre algorithme pour des besoins d'optimisation et de performances. Par exemple, le conteneur "list" a une méthode "sort").
Les conteneurs.
En c++, les conteneurs sont des classes offrant au programmeur une implémentation permettant de gérer des collections dynamiques d'objets du même type (on parle de conteneurs homogènes), c'est-à-dire pour lesquels le nombre d'objets contenus peut varier à l'exécution. Les conteneurs sont implémentés dans la bibliothèque standard en tant que "modèles de classe" (templates), ce qui permet de les utiliser avec n'importe quel type d'objets, standard ou défini par le programmeur (à l'exception de bitset).
De plus les conteneurs sont conçus de manière à être compatible avec les algorithmes de la bibliothèque standard.
Comme toute classe standard, il faut les inclure avec un en-tête (header) spécifique, qui est souvent le nom de la classe avec des < > autour. Exemple : pour utiliser la classe vector il faut préciser dans le programme un #include <vector> .
Pour leur présentation il est d'usage de les séparer en trois catégories :
Les conteneurs séquentiels.
Ils offrent des fonctionnalités suffisantes de base pour gérer simplement des collections d'objets. Tous permettent une insertion et un accès à tous les éléments par des itérateurs.
Il s'agit de vector, deque, list et bitset.
vector est un tableau dynamique où il est particulièrement aisé d'accéder directement aux divers éléments par un index, et d'en ajouter ou en retirer à la fin. À la manière des tableaux de type C, l'espace mémoire alloué pour un objet de type vector est toujours continu, ce qui permet des algorithmes rapides d'accès aux divers éléments. À noter qu'il existe une version spéciale de vector, vector<bool>, spécialement conçue pour économiser de la mémoire
deque (de "Double ended queue", file à double entrée) ressemble beaucoup à vector, mis à part qu'il est tout aussi efficace d'y insérer ou de supprimer des éléments au début de la liste. De plus, les éléments contenus ne sont pas forcément stockés de manière contigüe en mémoire, ce qui permet d'éviter de lourdes réallocations lors de changements importants dans le conteneur s'il est grand.
list est une liste doublement chainée. L'insertion et la suppression d'élément ou de groupes continus d'éléments y est efficace partout dans la liste, mais il n'est pas possible d'accéder directement (par un index) aux différents éléments. On est forcé de les parcourir avec les itérateurs. De la meme manière que deque, une liste chaînée ne voit pas ses differents éléments stockés en mémoire continument.
bitset est un cas particulier de conteneur. On peut l'assimiler à un tableau classique de bool. Le chiffre binaire étant la plus petite unité de mémoire possible, alors que le type de base du c++ le plus petit (char) est de taille 8 bits (habituellement), ces tableaux sont donc particulièrement optimisés pour stocker et manipuler une grande quantité d'informations qui peuvent être traduites par 1 ou quelques bits seulement.
Les conteneurs associatifs.
Les conteneurs associatifs supposent l'utilisation d'une "clé de recherche" (un numéro d'identification, ou des chaines classées par ordre alphabétique par exemple) et implémentent des fonctions efficaces de tri et de recherche. Ils sont habituellement triés continuellement (lors de chaque insertion d'éléments).
Il s'agit de set, multiset, map, multimap 
set ne contient que des objets du type clé de recherche tandis que map contient des clés associées avec un autre objet de type différent (exemple : Les numéros de téléphone dans un annuaire sont triés selon le nom de l'abonné correspondant au numéro). Toutes les clés sont supposées uniques.
Les conteneurs multiset et multimap sont les versions correspondantes qui autorisent la présence de plusieurs clés identiques (avec des algorithmes correspondants nécessairement un peu moins performants).
Les adaptateurs de conteneurs.
Les adaptateurs de conteneurs ne s'utilisent qu'en complément à un des conteneurs précédents, afin de lui ajouter des fonctionnalités plus précises.
Il s'agit de stack, queue, priority_queue
stack implémente une interface de pile (LIFO, Last In First Out : dernier arrivé, premier sorti).
queue implémente un interface de file d'attente (FIFO, First In First Out : premier arrivé premier sorti).
priority_queue implémente un interface de file d'attente où les éléments peuvent être comparés entre eux (par niveau de "priorité"), et sont classés dans la file suivant l'ordre spécifié. Ainsi elle permettent de traiter des données suivant des niveaux de priorité de manière efficace.
Les chaînes de caractères.
La classe string.
Exemple 1 : la classe string.
Fichier main.cpp
using namespace std;
int main (void)
 string s1, s2, s3;
 cout « "Tapez une chaine : "; cin » s1;
 cout « "Tapez une chaine : "; cin » s2;
 s3 = s1 + s2;
 cout « "Voici la concatenation des 2 chaines :" « endl;
 cout « s3 « endl;
 return 0;
Exécution.
Lorsqu'on exécute ce programme, il s'affiche à l'écran : 
Tapez une chaîne : AZERTY 
Tapez une chaîne : QSDFGH
Voici la concaténation des deux chaînes :
AZERTYQSDFGH
Exemple 2 : string avec des espaces.
using namespace std;
int main (void)
 string s1, s2, s3;
 cout « "Tapez une chaine : "; getline (cin, s1);
 cout « "Tapez une chaine : "; getline (cin, s2);
 s3 = s1 + s2;
 cout « "Voici la concatenation des 2 chaines :" « endl;
 cout « s3 « endl;
 return 0;
Exécution.
Lorsqu'on exécute ce programme, il s'affiche à l'écran :
Tapez une chaîne : AZ ERTY
Tapez une chaîne : QS DFGH
Voici la concaténation des deux chaînes :
AZ ERTYQS DFGH
Exemple 3 : analyse de chaînes.
using namespace std;
int main (void)
 string s= "BONJOUR";
 int taille = s.size ();
 cout « "La chaine comporte " « taille « " caracteres." « endl;
 for (int i = 0 ; i < taille ; i++)
 cout « "caractère " « i « " = " « s.at(i) « endl;
 return 0;
Exécution.
Lorsqu'on exécute ce programme, il s'affiche à l'écran :
 La chaîne comporte 7 caractères
 caractère 0 = B
 caractère 1 = O
 caractère 2 = N
 caractère 3 = J
 caractère 4 = O
 caractère 5 = U
 caractère 6 = R
Exemple 4 : compatibilité avec les tableaux de char et les char *.
using namespace std;
int main (void)
 string s1, s2;
 char c1 []= "BONJOUR";
 const char * c2;
 s1 = c1;
 cout « s1 « endl;
 s2 = "AU REVOIR";
 c2 = s2.c_str();
 cout « c2 « endl;
 return 0;
Explications.
Dans c2, on peut récupérer une chaîne « de type C » identique à notre string en écrivant c2=s2.c_str().
Exécution.
Lorsqu'on exécute ce programme, il s'affiche à l'écran : 
BONJOUR
AU REVOIR
Exemple 5 : transformation de string en int.
using namespace std;
int main (void)
 string s;
 cout « "Tapez une chaine : "; getline (cin, s);
 istringstream istr(s);
 int i;
 if (istr » i) cout « "VOUS AVEZ TAPE L'ENTIER " « i « endl;
 else cout « "VALEUR INCORRECTE" « endl;
 return 0;
Exécution 1.
Lorsqu'on exécute ce programme, il s'affiche à l'écran : 
Tapez une chaîne : 12345 
VOUS AVEZ TAPE L'ENTIER 12345
Exécution 2.
Lorsqu'on exécute ce programme, il s'affiche à l'écran : 
Tapez une chaîne : BJ9UYU
VALEUR INCORRECTE 
Les chaînes de caractères de type C.
Le header cstring défini un certain nombre de fonction permettant la manipulation de chaînes de caractères de type C.
strlen.
Lorsqu'une chaîne est enregistrée avec des unités de code de huit bits (soit un octet) la fonction strlen donne le nombre d'octets de la chaîne.
Si jamais le codage de caractère utilisé est l'un de ses anciens codage de caractères où le nombre d'octet correspond au nombre de caractères, ce nombre est alors aussi le nombre de caractères.
int strlen(char *str)
 int i = 0;
 while(str[i] != '\0')
 i++;
 return (i);
memchr.
char *pch;
int pospex;
pch = (char*) memchr (Trame, '!', strlen(Trame));
if(pch!=NULL)
 pospex = pch - Trame;
memchr(void* p, int c, size_t n).
memchr scrute les n premiers octets de p à la recherche du caractère c.
si succès, renvoie un pointeur sur la première occurrence de c dans p, sinon, renvoie NULL.