std::vector
est une classe template qui encapsule un tableau dynamique 1 stockée dans le tas, qui croît et décroît automatiquement si des éléments sont ajoutés ou supprimés. Il fournit tous les crochets ( begin()
, end()
, itérateurs, etc.) qui lui permettent de fonctionner correctement 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 en coulisse).
Comme il stocke les éléments dans la mémoire allouée sur le tas, il présente une certaine surcharge par rapport aux tableaux statiques.
std::array
est une classe modèle qui encapsule un tableau de taille statique, stocké dans 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 passée en tant que paramètre de modèle), et il ne peut ni croître ni décroître.
C'est plus limité que std::vector
mais il est souvent plus efficace, surtout pour les petites tailles, car en pratique, il s'agit surtout d'un emballage léger autour d'un tableau de style C. Cependant, il est plus sûr, puisque la conversion implicite en pointeur est désactivée, et il fournit une grande partie des fonctionnalités liées à la STL de std::vector
et des autres conteneurs, de sorte que vous pouvez l'utiliser facilement avec les algorithmes STL & co. Quoi qu'il en soit, pour la seule limitation de la taille fixe, il est bien moins flexible que std::vector
.
Pour une introduction à std::array
Jetez un coup d'œil à cet article ; pour une introduction rapide à std::vector
et aux opérations qu'il est possible d'effectuer sur lui, vous pouvez regarder son documentation .
-
En fait, je pense que dans la norme, ils sont décrits en termes de complexité maximale des différentes opérations (par exemple, accès aléatoire en temps constant, itération sur tous les éléments en temps linéaire, ajout et retrait d'éléments à la fin en temps constant amorti, etc.), mais je ne connais 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ë, donc c'est un tableau dynamique, stocké là où l'allocateur associé le place.
2 votes
Je cherche une comparaison entre
std::vector
vs.std::array
et comment les termes sont différents.1 votes
Zud,
std::array
n'est pas la même chose qu'un tableau C++.std::array
est une enveloppe très fine autour des tableaux C++, dont le but principal est de cacher le pointeur à l'utilisateur de la classe. Je vais mettre à jour ma réponse.0 votes
J'ai mis à jour le titre et le texte de la question pour refléter votre clarification.
0 votes
Si vous implémentez une fonction constexpr ou consteval, vous pouvez utiliser std::array, mais pas std::vector. stackoverflow.com/questions/33241909/