Les tableaux
Cours · OCaml (option informatique), chapitre 5 · prépas MPSI et MP, option informatique · le début du chapitre, la suite sur Adloun
5.1 Introduction et motivation
La liste (chapitre 2) est la structure naturelle du style fonctionnel, mais elle a un défaut : accéder à son -ème élément coûte un parcours, proportionnel à . Quand on a besoin d'un accès direct — lire ou écrire la case d'indice en temps constant — on emploie le tableau. C'est une structure mutable et de taille fixe, cousine de la liste Python, et qui se marie naturellement avec les boucles du chapitre précédent.
Les tableaux et les fonctions du module Array relèvent des éléments « utilisables après rappel » du programme : en épreuve, leur documentation est fournie. On les présente donc ici avec leur signature, qu'il n'est pas exigé de mémoriser, mais qu'il faut savoir lire et utiliser.
5.2 Créer et lire un tableau
Un tableau littéral s'écrit entre [| et |], éléments séparés par des points-virgules. Son type est 'a array, et comme une liste il est homogène.
# let t = [| 10; 20; 30 |];;
val t : int array = [|10; 20; 30|]
# t.(0);;
- : int = 10
# Array.length t;;
- : int = 3
On accède à la case d'indice i par t.(i), en temps constant. Les indices vont de 0 à Array.length t - 1.
Un accès t.(i) avec i hors de l'intervalle lève l'exception Invalid_argument "index out of bounds" à l'exécution. Comme en Python, la moitié des bogues sur les tableaux sont des erreurs d'indice : on relit chaque borne en se demandant « la dernière case est-elle t.(n) ou t.(n-1) ? » — c'est t.(n-1).
5.3 Modifier un tableau
C'est la grande différence avec la liste : un tableau est mutable. L'instruction t.(i) <- v remplace le contenu de la case i par v ; sa valeur est ().
# let t = [| 10; 20; 30 |];;
# t.(1) <- 99;;
- : unit = ()
# t;;
- : int array = [|10; 99; 30|]
5.3.1 Construire un tableau
Array.make n v: int -> 'a -> 'a array— un tableau dencases, toutes initialisées àv;Array.init n f: int -> (int -> 'a) -> 'a array— un tableau dencases, la caseivalantf i;Array.copy t: 'a array -> 'a array— un nouveau tableau qui contient les mêmes éléments quet: copie superficielle, donc pour une matrice les lignes restent partagées (copier chaque ligne avecArray.map Array.copy m).
Exercices du chapitre
- Construire avec
Array.initcorrigé - Renverser en place corrigé
- Recherche avec
optioncorrigé - Les fonctions du module
Arraycorrigé - Le piège de la valeur partagée corrigé
- Transposée d'une matrice corrigé