Beruflich Dokumente
Kultur Dokumente
: 2009/2010
ENSI – II2
STL 1 STL 2
STL 3 STL 4
1
Chapitre 8 : Les collections STL A.U. : 2009/2010
ENSI – II2
STL 7 STL 8
#include <vector>
#include <iostream> #include <deque>
using namespace std;
void main() Conteneurs - deque #include <iostream>
using namespace std;
{
vector<int> iv; // vector a initialement 0 elements. void main()
iv.push_back(42); // Ajoute 42 à la fin du vector
cout << "location: " << (void*) &iv[0] << endl;
{
int *k = &iv[0]; // Attention ! Location peut changer ! deque<int>
deque< > d;
cout << "iv[0] = " << iv[0] << endl; Deque = Double-
Double-Ended Queue for(int i=0; i<10; ++i)
cout << "*k = " << *k << endl; Tableau dynamique {
cout << "sz=" << iv.size() << " cap=" << iv.capacity();
iv.reserve(1024); // augmente la capacité et non pas taille Les éléments sont insérés à la fin .push_front( i );
d.push_front
cout << "\nlocation: " << (void*) &iv[0] << endl; ou au début du tableau }
cout << "sz=" << iv.size() << " cap=" << iv.capacity(); for(i=90; i<100; ++i )
iv.resize(2048); // augmente taille (et capacité)
cout << "\nlocation: " << (void*) &iv[0] << endl;
{
cout << "sz=" << iv.size() << " cap=" << iv.capacity(); .push_back( i );
d.push_back
cout << "\niv[0] = " << iv[0] << endl; }
cout << "*k = " << *k << endl; // danger! mauvaise valeur .size();++i)
for(i=0;i<d.size
}
location: 007E0EC0 location: 006D5294
{
iv[0] = 42 sz=2048 cap=2048 cout << d[[i]] << endl;
*k = 42
sz=1 cap=1
iv[0] = 42 }
*k = -572662307
location: 006D4260 }
sz=1 cap=1024
STL 9 STL 10
#include <list>
#include <iostream>
using namespace std; Comparaisons
Conteneurs - list
Void main() Les vector et les deque permettent d’accéder rapidement à un élément de la
{ liste (opérateur []) contrairement aux list
list<int>
list< > l; Un élément peut être inséré
for( int i=1; i<20; ++i ) • n’importe où pour une list
• Liste doublement chaînée {
• à la fin ou au début pour un deque
d’éléments
• à la fin seulement pour un vector
if( i % 2 == 0 )
Utiliser un vector est un bon choix lorsque:
.push_front(i);
l.push_front
• on a besoin d’insérer/supprimer des éléments seulement à la fin
• Un élément pointe sur son else • le conteneur doit être compatible au tableau C standard
prédecesseur et son successeur .push_back(i);
l.push_back Utiliser un deque est un bon choix lorsque:
dans la liste }
.empty() )
while( !l.empty
• on a besoin d’insérer/supprimer des éléments seulement à la fin ou au
début
• Les éléments sont insérés
{ • le conteneur ne doit pas être compatible avec un tableau C standard
n’importe où dans la liste
.front() << " ";
cout << l.front • la taille maximum requise du conteneur n’est pas connue
pop_front();
l.pop_front Utiliser une list est un bon choix lorsque:
// supprime le 1er élément • on a besoin d’insérer/supprimer des éléments au milieu du conteneur
} • le conteneur ne doit pas être compatible avec un tableau C standard
cout << endl; • la taille maximum requise du conteneur n’est pas connue
}
STL 11 STL 12
2
Chapitre 8 : Les collections STL A.U. : 2009/2010
ENSI – II2
• Les éléments du conteneur sont automatiquement triés • Les éléments sont triés selon leur valeur. Chacun des
lors de leur insertion selon un critère précis. éléments ne peut exister qu’une fois
• Le critère de tri prend la forme d’une comparaison de #include <set>
la valeur de l’élément ou d’une clé spéciale définie pour set<int> coll;
l’élément. ... 4
coll.insert(3);
• Les conteneurs associatifs sont généralement coll.insert(1);
représentés sous forme d’arbre binaire coll.insert(5); 2 6
• set
set,, multiset
multiset,, map et multimap sont des coll.insert(4);
coll.insert(1);
conteneurs associatifs coll.insert(6); 1 3 5
coll.insert(2);
STL 13 STL 14
STL 15 STL 16
• Même chose que map excepté qu’une clé peut exister • Le standard C++ fournit quelques conteneurs
plus d’une fois. supplémentaires:
• Piles (stacks): conteneur manipulant ses éléments
• On peut donc retrouver des éléments possédant la selon la politique LIFO (last-
(last-in
in--first-
first-out)
même clé mais des valeurs différentes • Files (queues): conteneur manipulant ses éléments
selon la politique FIFO (first-
(first-in
in--first-
first-out)
• Ex: dictionnaire • Queues de priorité:
priorité: conteneur manipulant ses
éléments selon la politique FIFO à priorité (un
élément plus prioritaire se retrouve en tête de file)
STL 17 STL 18
3
Chapitre 8 : Les collections STL A.U. : 2009/2010
ENSI – II2
• L’élément qui sera inclus dans un conteneur Un itérateur est un objet qui permet de naviguer
doit posséder: dans les éléments d’un conteneur
• constructeur copie
• opérateur d’affectation (operator =) Un itérateur est un pointeur « intelligent »
• destructeur (considéré comme intelligent car le déplacement dans un
• possiblement, un constructeur par défaut arbre binaire équilibré n’est pas comme un déplacement dans
une liste d’éléments contigüs)
• possiblement, un test d’égalité (operator ==)
• possiblement, un critère de tri (operator <, ...) L’itérateur fait le lien entre les conteneurs et les
bool operator < (const Complex & z) const { algorithmes
return ((re<z.re) || ((re==z.re) && (im==z.im)));
}
STL 19 STL 20
Opérateur == : Indique si 2 itérateurs pointent le même • erase(itérateur, itérateur): retire tous les éléments à partir de la position
indiquée par le premier itérateur jusqu’à la position indiquée par le second
élément • back(): retourne le dernier élément du conteneur
Opérateur = : Assigne un itérateur • front(): retourne le premier élément du conteneur
• pop_back(): retire le dernier élément du conteneur
• push_back(): insère un nouvel item à la fin du conteneur
STL 21 STL 22
STL 23 STL 24
4
Chapitre 8 : Les collections STL A.U. : 2009/2010
ENSI – II2
#pragma warning(disable:4786)
map>
#include <map
#include <string>
#include <iostream>
using namespace std;
Itérateurs – catégories
void main()
{
map< int, string > m;
• Bidirectionnel
::iterator it;
map< int, string >::iterator • peut itérer en direction avant (++) et arrière (--
(--))
m.insert(map< int, string >::value_type( 2, "Deux" ));
• type d’itérateur des conteneurs list
list,, set
set,, multiset
multiset,,
m.insert(map< int, string >::value_type( 3, "Trois" )); map et multimap
m.insert(map< int, string >::value_type( 5, "Cinq" ));
STL 25 STL 26
Itérateurs
Ces algorithmes offrent les
• vector<T>(taille, valeur) : services fondamentaux tels que
• vector<T>(itérateur, itérateur) : recherche, tri, copie, modification Algorithmes
Les conteneurs list et deque ont aussi ces constructeurs Les algorithmes ne sont PAS des
#include <list> #include <deque> fonctions membres des classes rate
u rs
Itér
ate
urs
Ité
list<char>::iterator it; conteneurs
list<char> L(10,’a’); it=L.begin(); it++; it++; Ce sont plutôt des fonctions Conteneurs Conteneurs
STL 29 STL 30
5
Chapitre 8 : Les collections STL A.U. : 2009/2010
ENSI – II2
#include <iostream>
#include <list>
#include <algorithm>
typedef list <char> contChar ;
STL 33 STL 34
STL 35 STL 36
6
Chapitre 8 : Les collections STL A.U. : 2009/2010
ENSI – II2
STL 37 STL 38
STL 39 STL 40
Conclusion
La STL est une bibliothèque efficace pour la
manipulation des collections.
La STL facilite ainsi l’implémentation des
relations entre classes (agrégation,
composition, association).
La STL fournit un certain nombre de classes
d'exceptions standard, que les fonctions de la
bibliothèque sont susceptibles de déclencher.
STL 41