129 votes

Tableaux vs Vecteurs : Similarités et Différences Introductives

Quelles sont les différences entre un tableau et un vecteur en C++? Un exemple des différences peuvent inclure les bibliothèques, la symbolique, les capacités, etc.

Tableau

Les tableaux contiennent un nombre spécifique d'éléments d'un type particulier. Ainsi, le compilateur peut réserver l'espace nécessaire lorsque le programme est compilé, vous devez spécifier le type et le nombre d'éléments que le tableau contiendra lors de sa définition. Le compilateur doit être en mesure de déterminer cette valeur lors de la compilation du programme. Une fois qu'un tableau a été défini, vous utilisez l'identifiant du tableau avec un index pour accéder à des éléments spécifiques du tableau. [...] les tableaux sont indexés à partir de zéro; c'est-à-dire que le premier élément est à l'index 0. Ce schéma d'indexation est indicatif de la relation étroite en C++ entre les pointeurs et les tableaux et les règles que le langage définit pour l'arithmétique des pointeurs.

— Référence de poche C++

Vecteur

Un vecteur est une séquence dynamique de objets qui fournit un accès aléatoire à la style tableau via l'opérateur operator[]. La fonction membre push_back copie ses arguments via le constructeur de copie, ajoute cette copie en tant que dernier élément dans le vecteur et incrémente sa taille de un. pop_back fait exactement le contraire, en supprimant le dernier élément. Insérer ou supprimer des éléments de la fin d'un vecteur prend du temps constant amorti, et insérer ou supprimer à partir d'un autre emplacement prend du temps linéaire. Ce sont les bases des vecteurs. Il y a beaucoup plus à savoir sur eux. Dans la plupart des cas, un vecteur devrait être votre premier choix sur un tableau de style C. Tout d'abord, ils ont une taille dynamique, ce qui signifie qu'ils peuvent grandir selon les besoins. Vous n'avez pas à faire toutes sortes de recherches pour trouver une taille statique optimale, comme dans le cas des tableaux C; un vecteur grandit selon les besoins, et il peut être redimensionné manuellement en plus grand ou plus petit si nécessaire. Ensuite, les vecteurs offrent une vérification des limites avec la fonction membre at (mais pas avec l'opérateur operator[]), de sorte que vous pouvez faire quelque chose si vous référencez un index inexistant au lieu de simplement voir votre programme planter ou pire, continuer l'exécution avec des données corrompues.

— Livre de cuisine C++

165voto

Matteo Italia Points 53117

Tableaux:

  • sont une construction de langage intégrée;
  • viennent presque sans modification de C89;
  • fournissent simplement une séquence continue et indexable d'éléments; pas de fioritures;
  • sont de taille fixe; vous ne pouvez pas redimensionner un tableau en C++ (sauf s'il s'agit d'un tableau de POD et qu'il est alloué avec malloc);
  • leur taille doit être une constante de compilation sauf s'ils sont alloués dynamiquement;
  • ils occupent leur espace de stockage en fonction de la portée où vous les déclarez;
  • s'ils sont alloués dynamiquement, vous devez explicitement les désallouer;
  • s'ils sont alloués dynamiquement, vous obtenez simplement un pointeur, et vous ne pouvez pas déterminer leur taille; sinon, vous pouvez utiliser sizeof (d'où l'idiome courant sizeof(arr)/sizeof(*arr), qui échoue cependant silencieusement lorsqu'il est utilisé de manière incontrôlée sur un pointeur);
  • décroissent automatiquement en pointeurs dans la plupart des situations; en particulier cela se produit lorsque vous les passez à une fonction, ce qui nécessite généralement de passer un paramètre séparé pour leur taille;
  • ne peuvent pas être retournés d'une fonction; (Sauf s'il s'agit de std::array)
  • ne peuvent pas être copiés/affectés directement;
  • les tableaux dynamiques d'objets nécessitent un constructeur par défaut, car tous leurs éléments doivent d'abord être construits;

std::vector:

  • est une classe modèle;
  • est une construction spécifique à C++;
  • est implémenté comme un tableau dynamique;
  • grandit et rétrécit dynamiquement;
  • gère automatiquement sa mémoire, qui est libérée à la destruction;
  • peut être passé à/retourné par des fonctions (par valeur);
  • peut être copié/affecté (cela effectue une copie profonde de tous les éléments stockés);
  • ne se dégrade pas en pointeurs, mais vous pouvez explicitement obtenir un pointeur vers leurs données (&vec[0] fonctionnera comme prévu);
  • apporte toujours avec lui le tableau dynamique interne sa taille (combien d'éléments sont actuellement stockés) et sa capacité (combien d'éléments peuvent être stockés dans le bloc actuellement alloué);
  • le tableau dynamique interne n'est pas alloué à l'intérieur de l'objet lui-même (qui contient simplement quelques champs de "gestion"), mais est alloué dynamiquement par l'allocateur spécifié dans le paramètre de modèle pertinent; le défaaut obtient la mémoire de la zone libre (le soi-disant tas), indépendamment de l'endroit où l'objet réel est alloué;
  • pour cette raison, ils peuvent être moins efficaces que les tableaux "réguliers" pour les tableaux locaux, courts et de petite taille;
  • lors de la réallocation, les objets sont copiés (déplacés, en C++11);
  • nécessite pas de constructeur par défaut pour les objets stockés;
  • est mieux intégré au reste de la soi-disant STL (il fournit les méthodes begin()/end(), les habituels typedef STL, ...)

Considérez également l' "alternative moderne" aux tableaux - std::array; J'ai déjà décrit dans une autre réponse la différence entre std::vector et std::array, vous voudrez peut-être y jeter un œil.

29voto

John Källén Points 3680

Je vais ajouter que les tableaux sont des structures très bas niveau en C++ et vous devriez essayer de vous en éloigner autant que possible lorsque vous "apprenez les rudiments" -- même Bjarne Stroustrup le recommande (c'est le designer de C++).

Les vecteurs offrent des performances très proches de celles des tableaux, mais avec de nombreuses fonctionnalités pratiques et des mesures de sécurité. Vous commencerez probablement à utiliser des tableaux lorsque vous interagissez avec des API qui traitent des tableaux bruts, ou lorsque vous créez vos propres collections.

15voto

Nicolas Brown Points 665

Ces références ont pratiquement répondu à votre question. En gros, les longueurs des vecteurs sont dynamiques tandis que les tableaux ont une taille fixe. lors de l'utilisation d'un tableau, vous spécifiez sa taille lors de la déclaration :

int monTableau[100];
monTableau[0]=1;
monTableau[1]=2;
monTableau[2]=3;

pour les vecteurs, vous le déclarez simplement et ajoutez des éléments

vector monVecteur;
monVecteur.push_back(1);
monVecteur.push_back(2);
monVecteur.push_back(3);
...

parfois, vous ne connaîtrez pas le nombre d'éléments nécessaires, alors un vecteur serait idéal pour une telle situation.

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