Maison  >  Article  >  développement back-end  >  Pourquoi `push_back` appelle-t-il le constructeur de copie plusieurs fois dans un vecteur ?

Pourquoi `push_back` appelle-t-il le constructeur de copie plusieurs fois dans un vecteur ?

DDD
DDDoriginal
2024-11-03 15:39:30967parcourir

Why Does `push_back` Invoke the Copy Constructor Multiple Times in a Vector?

Invocations multiples du constructeur de copie dans le vecteur Push-Back

Dans l'extrait donné, la méthode push_back de l'objet vectoriel myints appelle la copie constructeur plus de deux fois, contredisant l’attente initiale. Cela soulève des questions sur le comportement interne du vecteur.

Explication :

Premier refoulement :

  • A le nouvel élément est inséré dans le vecteur en utilisant x. Cela déclenche une opération de copie : l'initialisation du nouvel élément à l'aide de l'argument. Étant donné que le constructeur par défaut de x initialise my_int à zéro, le constructeur de copie rapporte zéro.

Deuxième refoulement et réallocation :

  • Le deuxième élément est push_back'd. Cependant, la capacité du vecteur est dépassée, ce qui nécessite une réallocation. Comme Myint ne dispose pas d'un constructeur de déplacement implicite, le constructeur de copie est utilisé à la place.
  • Le premier élément est copié dans la nouvelle mémoire, en conservant sa valeur zéro. Par la suite, x est copié pour initialiser le deuxième élément avec my_int défini sur un, comme indiqué dans la sortie du constructeur de copie.
  • Il en résulte trois invocations totales du constructeur de copie.

Le nombre d'appels :

  • Le nombre d'appels au constructeur de copie peut varier selon les différentes implémentations en raison de la capacité vectorielle initiale. Cependant, deux appels sont le minimum.
  • La réallocation peut être évitée, réduisant ainsi les opérations de copie, en augmentant à l'avance la capacité du vecteur à l'aide de reserve(2).

Réduire Opérations de copie :

  • Alternativement, la méthode emplace_back peut être utilisée pour l'insertion d'éléments. Elle ne nécessite pas de copies ou de déplacements, transmettant directement les arguments au constructeur de l'élément.

En résumé, la méthode push_back peut entraîner plusieurs invocations de constructeur de copies en raison de la restructuration interne du vecteur. Pour éviter cela, reserve() peut être utilisé pour augmenter la capacité ou emplace_back peut être utilisé pour une insertion efficace d'éléments sans copies.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn