Maison > développement back-end > C++ > le corps du texte

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

DDD
Libérer: 2024-11-03 15:39:30
original
963 Les gens l'ont consulté

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!