Les
conteneurs
Dans la librairie standard du C++, différents conteneurs sont
proposés, vector, map ... , ainsi que les deque (double ended queue)
qui sont des sortes de tableaux mais permettent l'insertion rapide en
début et en fin de conteneur.
Nous étudierons surtout le type list.
Exemple:
#include <iostream>
#include <string>
#include <list>
using namespace std;
int main()
{
list<string> l;
l.push_back(string("Longtemps"));
l.push_back(string("je"));
l.push_back(string("me"));
l.push_back(string("suis"));
l.push_back(string("couché"));
l.push_back(string("de"));
l.push_back(string("bonne"));
l.push_back(string("heure"));
list<string>::iterator it;
for (it = l.begin(); it != l.end(); ++it)
cout << *it << " ";
cout << endl;
}
Evidemment, on utilise ici des templates, donc on pourrait aussi bien
faire une liste d'entiers en mettant list<int> à la place
de list<string> et en mettant des entiers dans la liste. On peut
faire aussi des list<maclasseperso>, des
list<maclasseperso*> ...
Exemple:
#include <iostream>
#include <string>
#include <list>
using namespace std;
int main()
{
list<double> l;
list<double>::iterator it;
l.push_back(2.1); // on ajoute un élément à la fin de la liste
l.push_front(5.6); // idem au début de la liste
l.push_back(3.2);
l.push_back(6.4);
for (it = l.begin(); it != l.end(); ++it)
cout << *it << " ";
cout << endl;
l.pop_back(); // nous avons aussi pop_front() pour enlever ce qui se trouve au début de la liste
// attention, contrairement à beaucoup d'implémentations de pop,
// l'élément enlevé n'est pas retourné par la fonction
cout << l.front() << " "<< l.back() << " " << l.size() <<endl; // on peut faire aussi l.front() = 12.2;
cout << l.empty() <<endl; // retourne 0 ce n'est pas vide
l.clear();
cout << l.empty() <<endl; // retourne 1 c'est vide
}
On peut aussi insérer au milieu d'une liste (c'est fait pour) et
enlever des éléments au milieu de la liste.
Exemple:
#include <iostream>
#include <string>
#include <list>
using namespace std;
int main()
{
list<double> l;
list<double>::iterator it;
l.push_back(2.1); // on ajoute un élément à la fin de la liste
l.push_back(5.6);
l.push_back(3.2);
l.push_back(6.4);
it=l.begin(); it++; it++;
l.insert(it, 100.0);
for (it = l.begin(); it != l.end(); ++it)
cout << *it << " ";
cout << endl; // on obtient 2.1 5.6 100 3.2 6.4
l.remove(5.6); // on obtient 2.1 100 3.2 6.4
it=l.begin(); it++; it++;
l.erase( it, l.end()); // on obtient 2.1 100
for (it = l.begin(); it != l.end(); ++it)
cout << *it << " ";
cout << endl;
cout << l.size() << endl;
l.clear();
}
Quelques méthodes utiles de la classe liste : l.sort() pour
trier , l.unique() utilisé après sort() pour
éliminer les doublons (< et == sont supposés
définis sur les éléments de la liste).
l.merge(autreliste) pour fusionner , l.swap(autreliste)
pour échanger les deux listes, l.reverse() pour inverser la
liste.