95 votes

Les tableaux doivent être utilisés en C++ ?

É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 `` ?

109voto

dasblinkenlight Points 264350

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).

85voto

James Kanze Points 96599

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 avec std::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.

15voto

duffymo Points 188155

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.

11voto

Ed Heal Points 24309

J’ai travaillé sur la sécurité des systèmes critiques où vous ne pouvez pas utiliser l’allocation de mémoire dynamique. La mémoire doit toujours être sur la pile. C’est pourquoi dans ce cas vous utiliserez tableaux que la taille est fixée à la compilation.

6voto

Vikas Points 3756

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.

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