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.