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?
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?
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.
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.
std::array
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.
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.