Les tableaux et les vecteurs
En C, un tableau est juste une séquence d’éléments en mémoire et il est
représenté par l’adresse du premier élément. Si un int
fait 4 octets,
un tableau de 10 int
fait 40 octets. Le C n’a aucun moyen de connaître
la taille d’un tableau et ne peut donc pas vérifier que l’index soit dans
le domaine autorisé.
Un tableau de 10 entiers est déclaré comme ça :
int a[10];
Si on passe ce tableau à une procédure, un passe simplement l’adresse du premier élément. Le tableau est passé par référence à la procédure. Comme C ne connaît pas la taille d’un tableau passé en argument, il est commun de passer un argument supplémentaire avec la taille.
La fonction suivante est un exemple d’une telle fonction qui détecte si un nombre est présent dans un tableau :
bool IsPresent(int x, int array[], int length) {
for (int i = 0; i < length; i++) {
if (array[i] == x) return true;
}
return false;
}
Ce traitement très “bas niveau” des tableaux en C est la source de
beaucoup d’erreurs en C et le C++ offre une structure similaire aux
tableaux de Java avec le type vector
de la bibliothèque standard.
Avec le type vector
, la fonction IsPresent
devient :
bool IsPresent(int x, std::vector<int>& v) {
for (int i = 0; i < v.size(); i++) {
if (v[i] == x) return true;
}
return false;
}
Notez qu’en C++, comme en Java, on peut utiliser l’instruction for
pour
itérer sur une plage (Range-based for) :
bool IsPresent(int x, std::vector<int>& v) {
for (int i : v) {
if (i == x) return true;
}
return false;
}
C’est également possible avec des tableaux dont la taille est connue à la compilation :
int a[] = {1,2,3,4,5};
int sum = 0;
for (int i : a) {
sum += i;
}
Attention
Mais ça ne fonctionne pas quand le tableau est passé en paramètre :
bool IsPresent(int x, int v[]) {
for (int i : v) { // !!! ERROR
if (i == x) return true;
}
return false;
}
En C++, l’opérateur []
ne vérifie pas que l’index soit valide et on peut
très bien lire ou écrire au-delà des limites du tableau. Si on souhaite
une vérification au “run time”, on doit utiliser la méthode at
au lieu de []
.
Les tableaux simples sont plus efficaces et prennent moins de place en mémoire et les vecteurs sont plus flexibles.