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.
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::.
|
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 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!
|
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). |