Sobes.tech
Middle

Que se passe-t-il avec le vecteur (std::vector) lors de l'ajout d'un élément?

sobes.tech IA

Réponse de l'IA

Lors de l'ajout d'un élément à std::vector (par exemple, avec push_back), les étapes suivantes se produisent:

  1. Vérification de la capacité: Le vecteur vérifie si la mémoire allouée actuelle (capacité) est suffisante pour accueillir un nouvel élément.
  2. Extension si nécessaire:
    • Si size() < capacity(), le nouvel élément est simplement placé à l'emplacement libre suivant, et size() est incrémenté de 1.
    • Si size() == capacity(), le vecteur doit augmenter sa capacité. Cela se fait généralement en allouant un nouveau bloc de mémoire plus grand. La taille du nouveau bloc est typiquement plusieurs fois supérieure à l'actuelle (par exemple, doublée).
  3. Copie/déplacement des éléments (lors de l'extension): Tous les éléments existants de l'ancien bloc de mémoire sont copiés (ou déplacés, si le type d'élément supporte le déplacement et qu'un constructeur/opérateur approprié est disponible) vers le nouveau bloc.
  4. Placement du nouvel élément: Le nouvel élément est ajouté à la fin du nouveau bloc de mémoire.
  5. Libération de l'ancienne mémoire: L'ancien bloc de mémoire est libéré.
  6. Mise à jour des pointeurs/taille: Les pointeurs internes (pointant vers le début et la fin des données, ainsi que vers la fin de la mémoire allouée) sont mis à jour, et la valeur de size() est également augmentée.

Cette opération peut être coûteuse en raison de possibles réallocations de mémoire, copies/déplacements d'éléments et libérations de mémoire ancienne. Elle peut également invalider les itérateurs et références pointant vers les éléments du vecteur avant l'ajout.