Étant donné que et
existent, y a-t-il une raison d’utiliser les traditionnels tableaux C en C++ ou doivent ils être évités, tout comme `` ?
Réponses
Trop de publicités?C ++11 dans lesquelles `` est disponible, la réponse est « oui, tableaux doivent être évitées ». Avant C ++11, vous devrez peut-être utiliser C tableaux pour allouer des tableaux dans le stockage automatique (c'est-à-dire sur la pile).
Certainement, mais avec std::array
en C++11, pratiquement que pour
les données statiques. C le style des tableaux ont trois avantages importants par rapport à
std::vector
:
-
Ils ne nécessitent pas d'allocation dynamique. Pour cette raison, de style C les tableaux sont à privilégier, où vous êtes susceptible d'avoir beaucoup de très les petits tableaux. Dites quelque chose comme un n-dimension point:
template <typename T, int dims> class Point { T myData[dims]; // ... };
Généralement, on pourrait imaginer qu'
dims
sera très faible (2 ou 3),T
un type (double
), et que vous risquez de vous retrouver avecstd::vector<Point>
avec des millions d'éléments. Vous avez certainement n'avez pas voulez des millions d'allocations dynamiques de 3 double. -
Le soutien initialisation statique. Ce n'est qu'un problème de statique de données, où quelque chose comme:
struct Data { int i; char const* s; }; Data const ourData[] = { { 1, "one" }, { 2, "two" }, // ... };
C'est souvent préférable à l'utilisation d'un vecteur (et
std::string
), puisqu'il évite tous les ordre de l'initialisation des questions; les données sont pré-chargés, avant tout code peut être exécuté. Enfin, ci-dessus, le compilateur peut calculer le réel la taille de la matrice à partir de la initialiseurs. Vous n'avez pas à les compter.
Si vous avez accès à C++11, std::array
résout les deux problèmes,
et devrait certainement être utilisé de préférence pour le style C des matrices dans la
premier cas. Il ne traite pas de la troisième, cependant, et d'avoir la
compilateur dimension du tableau en fonction du nombre de initialiseurs est
encore une raison valable à préférer C le style des tableaux.
Ne jamais dire « jamais », mais je suis d’accord que leur rôle est fortement diminuée par des structures de données vraie de STL.
Je dirais aussi que l’encapsulation à l’intérieur d’objets devraient réduire au minimum l’impact des choix comme ça. Si le tableau est un membre de données privé, vous pouvez échanger in ou out sans affecter les clients de votre classe.
array
en c++
vous donne de taille fixe alternative rapide de la dynamique de la taille d' std::vector
et std::list
. std::array est l'un des ajouts en c++11
. Il offre l'avantage de std conteneurs tout en continuant à fournir le type de regroupement sémantique de C-style de tableaux.
Donc, en c++11
je serais certainement utiliser std::array
, lorsqu'il est exigé, au cours de vecteur. Mais je préfère éviter de C gamme de style en C++03
.