115 votes

Quelle est la différence entre std :: array et std :: vector? Quand utilisez-vous l'un sur l'autre?

Quelle est la différence entre std::array et std::vector ? Quand utilisez-vous l'un sur l'autre?

J'ai toujours utilisé et considéré std:vector comme moyen d'utiliser les tableaux C en C ++, alors quelle est la différence?

155voto

Nemo Points 32838

std::array est juste une classe version de la classique C de la matrice. Cela signifie que sa taille est fixe au moment de la compilation et il sera attribué qu'un seul morceau (par exemple en prenant de l'espace sur la pile). L'avantage est légèrement améliorer les performances, car il n'y a pas d'indirection entre l'objet et le revêtit de données.

std::vector est une petite classe contenant des pointeurs dans le tas. (Donc quand vous allouer un std::vector, il appelle toujours new.) Ils sont légèrement plus lent d'accès à cause de ces pointeurs doivent être chassé pour se rendre à l'vêtu de données... Mais en échange de cela, ils peuvent être redimensionnées et ils ne prennent une mince quantité d'espace de pile, peu importe comment grand ils sont.

[modifier]

Comme pour savoir quand utiliser l'un sur l'autre, honnêtement std::vector est presque toujours ce que vous voulez. La création de grands objets sur la pile est généralement mal vu, et le niveau supplémentaire d'indirection est généralement pas pertinent. (Par exemple, si vous parcourir tous les éléments de la mémoire supplémentaire d'accès n'arrive qu'une fois au début de la boucle.)

Le vecteur éléments sont garantis d'être contiguës, de sorte que vous pouvez passer &vec[0] pour toute fonction attend un pointeur vers un tableau; par exemple, C routines de la bibliothèque. (En aparté, std::vector<char> buf(8192); est une excellente façon d'allouer un tampon local pour les appels à l' read/write ou similaire, sans directement en invoquant new.)

Cela dit, l'absence de ce niveau supplémentaire d'indirection, plus la constante de compilation de la taille, peut faire l' std::array nettement plus rapide pour un très petit tableau qui vient d'être créé/détruit/consulté beaucoup.

Donc, mon conseil serait: Utiliser std::vector , à moins que (a) votre profiler vous dit que vous avez un problème et (b) le tableau est minuscule.

22voto

Nicol Bolas Points 133791

Je vais supposer que vous savez que std::array est au moment de la compilation fixe à la taille, tandis que std::vector est de taille variable. Aussi, je vais supposer que vous savez que std::array n'est pas de faire de l'allocation dynamique. Donc, au lieu de cela, je vais répondre à pourquoi vous utiliser std::array au lieu de std::vector.

Avez-vous jamais trouvé cela:

std::vector<SomeType> vecName(10);

Et puis vous n'avez jamais réellement augmenter la taille de la std::vector? Si oui, alors std::array est une bonne alternative.

Mais vraiment, std::array (couplé avec initialiseur de listes) existe pour faire style C des tableaux presque tout à fait inutile. Ils ne font généralement pas de rivaliser avec les std::vecteurs; ils sont en concurrence plus avec C-style de tableaux.

Il pense que le C++ comité de faire de leur mieux pour tuer presque tous légitimes de l'utilisation de la C-style de tableaux.

14voto

Luc Danton Points 21421

std::array

  • est un agrégat
  • est de taille fixe
  • exige que son des éléments par défaut constructible (vs copier (C++03) ou déménagement (C++0x) constructibles)
  • est linéairement remplaçables à chaud (vs constante de temps)
  • est linéairement mobiliers (vs constante de temps)
  • potentiellement paie moins d'indirection qu' std::vector

Un bon exemple d'utilisation: faire les choses " fin-de-la-métal, tout en gardant les subtilités du C++ et de garder toutes les mauvaises choses de raw tableaux de la route.

9voto

Xeo Points 69818

Même raisonnement lorsque vous utilisez un tableau statique de type C, plutôt qu’un `` . Et pour cela, j’ai de bien vouloir vous référer à ici.

8voto

Etienne de Martel Points 16020

a un taux fixe (moment de la compilation) taille, tout en peut se développer.

Par conséquent, revient à utiliser un tableau C, tandis que est comme attribution dynamique de mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X