Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ruft „push_back“ den Kopierkonstruktor mehrmals in einem Vektor auf?

Warum ruft „push_back“ den Kopierkonstruktor mehrmals in einem Vektor auf?

DDD
DDDOriginal
2024-11-03 15:39:30967Durchsuche

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

Mehrere Aufrufe des Kopierkonstruktors im Vektor-Push-Back

Im angegebenen Snippet ruft die push_back-Methode des Vektorobjekts myints die Kopie auf Konstruktor mehr als zweimal, was der ursprünglichen Erwartung widerspricht. Dies wirft Fragen zum internen Verhalten des Vektors auf.

Erklärung:

Erster Push-Back:

  • A neues Element wird mit x in den Vektor eingefügt. Dies löst einen Kopiervorgang aus: Die Initialisierung des neuen Elements mithilfe des Arguments. Da der Standardkonstruktor von push_back'd. Allerdings wird die Kapazität des Vektors überschritten, was eine Neuzuweisung erforderlich macht. Da Myint keinen impliziten Verschiebungskonstruktor hat, wird stattdessen der Kopierkonstruktor verwendet.
Das erste Element wird in den neuen Speicher kopiert und behält seinen Nullwert. Anschließend wird x kopiert, um das zweite Element zu initialisieren, wobei my_int auf eins gesetzt ist, wie in der Ausgabe des Kopierkonstruktors angezeigt.

Dies führt zu insgesamt drei Aufrufen des Kopierkonstruktors.

  • Die Anzahl der Aufrufe:
  • Die Anzahl der Aufrufe des Kopierkonstruktors kann aufgrund der anfänglichen Vektorkapazität je nach Implementierung variieren. Allerdings sind zwei Aufrufe das Minimum.
Eine Neuzuweisung kann vermieden werden, wodurch Kopiervorgänge reduziert werden, indem die Kapazität des Vektors im Voraus mithilfe von Reserve(2) erhöht wird.

Reduzieren Kopiervorgänge:
  • Alternativ kann die Methode emplace_back zum Einfügen von Elementen verwendet werden. Es sind keine Kopien oder Verschiebungen erforderlich, da Argumente direkt an den Konstruktor des Elements weitergeleitet werden.

Zusammenfassend lässt sich sagen, dass die push_back-Methode aufgrund der internen Vektorumstrukturierung zu mehreren Aufrufen des Kopierkonstruktors führen kann. Um dies zu vermeiden, kann „reserve()“ zur Kapazitätserhöhung oder „emplace_back“ zum effizienten Einfügen von Elementen ohne Kopien verwendet werden.

Das obige ist der detaillierte Inhalt vonWarum ruft „push_back“ den Kopierkonstruktor mehrmals in einem Vektor auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn