Collections et boucle «pour tout … dans …»#
Quelques exemples de collections#
Rappel : tableaux (vector
)#
Nous avons vu qu’un tableau (vector
en C++) regroupe plusieurs
valeurs dans un ordre donné, en tenant compte des répétitions :
#include<vector>
using namespace std;
vector<int> v = { 3, 2, 5, 2 };
v
Cela donne un sens au i-ième élément d’un tableau :
v[3]
Un tableau est un exemple de valeur composite homogène, ou collection qui regroupe plusieurs valeurs d’un même type.
Il existe d’autres types de collections. Voyons quelques exemples.
Ensembles (set
)#
Lorsque l’on souhaite ne tenir compte ni de l’ordre, ni des
répétitions – comme dans un ensemble mathématique – on peut
utiliser un set
:
#include <set>
using namespace std;
set<int> s = { 3, 2, 5, 2};
s
Du coup, accéder au i-ième élément n’a pas de sens :
s[1]
Multi-ensembles (multiset
)#
Si l’on ne souhaite pas tenir compte de l’ordre mais tout de même
des répétitions, on peut utiliser un multi-ensemble (multiset
) :
multiset<int> m = { 3, 2, 5, 2 };
m
Boucle for each
#
Une opération omniprésente sur une collection est de parcourir toutes ses valeurs : jusqu’ici on l’a fait à l’aide d’un index :
#include<vector>
#include<iostream>
using namespace std;
vector<int> v = { 3, 2, 5, 2 };
for ( int i=0; i < v.size(); i++ )
cout << v[i] << endl;
C’est un peu lourd, et sujet à erreurs. Surtout, cela ne se généralisera pas aux ensembles! (pourquoi?).
À la place nous allons littéralement écrire «pour toute valeur
dans
v
faire …» :
for ( auto valeur: v )
cout << valeur << endl;
C’est l’équivalent du for valeur in v:
de Python.
Et cela fonctionnera tout aussi bien pour toute autre collection :
#include<set>
set<int> s = { 3, 2, 5, 2 };
for ( auto valeur: s )
cout << valeur << endl;
multiset<int> m = { 3, 2, 5, 2 };
for ( auto valeur: m )
cout << valeur << endl;
Digression : à propos de auto
♣#
Vous vous demandez peut-être quelle est la
signification de auto
?
On est en train de déclarer une nouvelle variable.
Il faut donc préciser son type. On pourrait très
bien mettre int
ci-dessus puisque l’on manipule
des collections d’entiers :
for ( int valeur: v )
cout << valeur << endl;
auto
est un type spécial qui indique à C++ de
sélectionner automatiquement le type adéquat en
fonction du contexte, ce qui est facile ici.
auto i = 1;
i
auto pi = 3.14;
pi