- vectors :
- tableau dynamique
- élément avec accès aléatoire, retrait et insertion.
- peu ou pas de retrait au milieu
- list :
- liste doublement chainée
- aussi forward_list pour une liste simplement chainée
- traitement séquentiel, avec insertion ou retrait n'importe où dans la liste
- deque
- file à deux extrémités
- se comporte comme un vecteur mais avec insertion et retrait en tête ou en queue de liste
- les éléments se sont pas nécessairement contigus
- array
- tableau fixe
- Le conteneur contient des copies des éléments ajoutés.
- Les éléments à mettre dans le contenueur doivent avoir un constructeur par défaut, un constructeur copieur, et un opérateur =
Exemple : Initialisation et itérationIl existe quatre types d'itérateurs pouvant parcourir un conteneur.
- ::iterator
- ::reverse_iterator
- ::const_iterator
- ::const_reverse_iterator
Les itérateurs const ne permettent pas de modifier le conteneur. Les itérateurs inversés utilisent rbegin() et rend() alors que les autres utilisent begin() et end()
En tout temps, utiliser vector plutôt qu'un tableau fixe, ou de l'allocation dynamique. Il faut toutefois l'utiliser efficacement :
vector
v.reserve(10);
void fct(int a[], int dim);
vector<int> v;
[...]
fct(&v[0], v.size());
fct(&*v.begin(), v.size());
vector<int>(v.begin(), v.end()).swap(v);
// un nouveau vecteur d'entier est initialisé avec les valeurs de v.
// La durée de vie correspond à la durée de l'énoncé.
Les itérateurs servent à désigner des partitions à l'intérieur d'un conteneur.
Les itérateurs peuvent être invalidés lors d'une insertion ou retrait.
Les itérateurs permettent de définir des intervalles à la construction.
Remarque : Là où des itérateurs sont requis, on peut toujours utiliser des pointeurs.
Exemple 1map<CLEF, VALEUR> m;
Attention, le find utilise le < pour trouver l'élément
Équivalence : !(a < b) && !(b < a);
Conclusion :
if (m["banane"] > 10)
Si la clé n'existe pas, un int est créé par défaut et la clé banane est insérée. Ce int contient n'importe quoi.Il vaut mieux utiliser
if (m.find("banane") != m.end() && m["banane"] > 10)
Le multimap permet d'avoir plus d'une valeur par clé, donc insert est toujours valide.
**Attention: Il ne faut jamais mettre à jour la clé d'un conteneur associatif.