std::vector
est une classe de modèle qui encapsule un tableau dynamique 1 , stocké dans le tas, qui grandit et se rétrécit automatiquement si des éléments sont ajoutés ou supprimés. Il fournit tous les crochets ( begin()
, end()
, itérateurs, etc.) qui le font fonctionner très bien avec le reste de la STL. Il dispose également de plusieurs méthodes utiles qui vous permettent d'effectuer des opérations qui, sur un tableau normal, seraient fastidieuses, comme par exemple l'insertion d'éléments au milieu d'un vecteur (il gère tout le travail de déplacement des éléments suivants dans les coulisses).
Puisqu'il stocke les éléments en mémoire alloués sur le tas, il a une surcharge en ce qui concerne les tableaux statiques.
std::array
est une classe de modèle qui encapsule un tableau de taille statique, stocké à l'intérieur de l'objet lui-même, ce qui signifie que si vous instanciez la classe sur la pile, le tableau lui-même sera sur la pile. Sa taille doit être connue au moment de la compilation (elle est transmise en tant que paramètre de modèle), et elle ne peut pas augmenter ou diminuer.
Il est plus limité que std::vector
, mais il est souvent plus efficace, en particulier pour les petites tailles, car en pratique, il s'agit principalement d'un wrapper léger autour d'un tableau de style C. Cependant, il est plus sécurisé, car la conversion implicite en pointeur est désactivée, et il fournit une grande partie des fonctionnalités liées à STL std::vector
et des autres conteneurs, vous pouvez donc l'utiliser facilement avec les algorithmes & co STL. Quoi qu'il en soit, pour la limitation même de la taille fixe, il est beaucoup moins flexible que std::vector
.
Pour une introduction à std::array
, consultez cet article ; pour une introduction rapide à std::vector
et aux opérations qui y sont possibles, vous pouvez consulter sa documentation .
En fait, je pense que dans la norme elles sont décrites en termes de complexité maximale des différentes opérations (ex: accès aléatoire en temps constant, itération sur tous les éléments en temps linéaire, ajout et suppression d'éléments à la fin en temps amorti constant, etc), mais AFAIK il n'y a pas d'autre méthode pour répondre à ces exigences que d'utiliser un tableau dynamique. Comme indiqué par @Lucretiel, la norme exige en fait que les éléments soient stockés de manière contiguë, il s'agit donc d' un tableau dynamique, stocké là où l'allocateur associé le place.
std::vector
vsstd::array
et comment les termes sont différents.