La librairie STL

STL est une bibliothèque standard du C++. Ce qui veut dire qu'il n'y a pas besoin d'options de compilation ou de Makefile compliqué! D'autre part, tout le code est contenu dans les fichiers header, il n'y a donc pas de librairies à linker. Pour se servir de la STL, il suffit de faire des #include!

Le tutorial a été écrit suite à la lecture d'un certain nombres d'ouvrages sur le C++ (voir la bibliographie pour plus de détails). Il s'appuie sur le site de référence de l'implémentation de la STL du compilateur MipsPRO de SGI. Les exemples sont testés sous la Mandrake 8.0 avec le compilateur gcc-2.96.

Un mot sur les namespaces

La bibliothèque standard se trouve entièrement dans le namespace std. Pour ceux qui ne savent pas, un namespace (espace de nom en français) est un moyen de lutter contre les conflits de noms (voir ci-dessous la rubrique "un peu plus loin..." pour des détails).

Concrètement, les types et fonctions que nous étudierons dans ce tutorial, comme par exemple le type list s'appellent en réalité std::list. Cependant pour ne pas alourdir les examples de code (et parce que en général, l'emploi de directives using permet ce raccourci), nous omettrons le std::.

idée Un peu plus loin...
. Certains noms sont assez communs et peuvent avoir été utilisés par plusieurs librairies. Par exemple, beaucoup de librairies ont une classe de base abstraite qui porte le nom class Objet. Si vous essayez d'inclure les fichiers d'entêtes de deux librairies définissant une telle classe, vous aurez un conflit de nom, les références au type Objet étant alors ambigues.

Une solution classique est d'ajouter en début des noms de classes d'une librairie un préfixe "unique" rappellant le nom de la librairie. L'excellente librairie Qt défini ainsi la classe QObject. Une autre très bonne librairie, dans ses premières versions, préfixait tous ses noms par CGAL_.

Si cette solution s'avère bonne, elle est néanmoins lourde pour l'utilisateur! En effet, si les conflits de noms peuvent se produire (auquel cas, si les librairies en conflit sont déjà compilées, il est impossible de s'en sortir!) ils sont cependant rares. Il est alors pénible de devoir utiliser des noms à rallonge (à cause de préfixes) alors qu'il n'y aurait aucune ambiguité à en utiliser une version courte!

Les namespaces sont une solution à ces remarques: ce sont des préfixes que l'on peut omettre lorsqu'il n'y a pas d'ambiguité sur un nom. Tout type, variable ou fonction défini à l'intérieur d'un namespace a pour "vrai" nom (on dit aussi nom long ou nom pleinement qualifié [fully qualified name]) son nom précédé du nom du namespace et de ::. Par exemple la déclaration:

défini le type Lib::Toto. Cependant quand aucune ambiguité n'existe, le programmeur peut utiliser le type Toto directement.

Pour cela, il faut qu'il utilise au choix une des directives suivantes, placée au début du fichier où il utilise la classe Toto, juste aprés les directives #include:

La première indique que lorsque le compilateur rencontrera le type Toto, il devra l'interprèter comme Lib::Toto. La seconde est équivalente à utiliser la directive précédente pour tous les types,classes et fonctions définis dans le namespace Lib, et non plus seulement pour Toto.

. Une règle importante est de ne jamais utiliser de directives using dans un fichier d'entête (.h). En effet, si vous faites cela, vous qualifiez complètement certains noms pour tout fichier qui incluera votre .h. Or ces fichiers incluereont peut-être d'autre fichiers qui définissent des classes avec le même nom que les votres. Vous empecher ainsi les utilisateurs de votre fichier de profiter de namespaces pour spécifier l'un ou l'autre des noms!

Un mot sur les directive #include

Un certain nombre d'implémentation de la STL ayant été mises en circulation avant que le comité de normalisation du C++ ne mette au point la norme ISO décrivant le langage et notamment la STL, les fichiers d'entête correspondant à la STL peuvent porter 2 noms différents (un non-standard et un standard).

Pour schématiser, il y a un nom avec suffixe .h, et un nom sans. Cependant certains fichiers on aussi leur racine qui ont changé, ou ont été séparés en 2 fichiers. Ainsi, algo.h est séparé en algorithm et functionnal.

Dans ce tutoriel, nous utiliserons toujours le nom standard, et nous vous exhortons à faire de même!. Si votre compilateur ne supporte pas la norme, changez-en!

idée Un peu plus loin...
Au passage, signalons qu'un certain nombre de fichiers de la librairie standard ont été aussi renommés pour permettre d'inclure toutes les fonctions qu'ils définissent dans le namespace std. Les anciens noms sont maintenus pour compatibilité. Le tableau ci dessus résume les changements (d'après Scott Meyers, op.cit).
Page maintenue par Xavier Décoret. Valid XHTML 1.0! Valid CSS!