Bei der Arbeit mit Vektoren kann man davon ausgehen, dass die push_back-Operation nur eine Handvoll Kopierkonstruktoraufrufe erfordert. In bestimmten Fällen kann es jedoch zu unerwartetem Verhalten kommen, beispielsweise zu mehreren Aufrufen.
Bedenken Sie den folgenden Codeausschnitt:
<code class="cpp">class Myint { int my_int; public: Myint() : my_int(0) { /* ... */ } Myint(const Myint& x) : my_int(x.my_int) { /* ... */ } }; int main() { vector<Myint> myints; Myint x; myints.push_back(x); // Call 1 x.set(1); myints.push_back(x); // Call 2 }</code>
Intuitiv würden wir zwei Aufrufe des Kopierkonstruktors erwarten: einen für den ersten push_back und noch einer für den zweiten. Die Ausgabe erzählt jedoch eine andere Geschichte:
Call 1 (default constructor) Call 2 (copy constructor: my_int = 0) Call 3 (copy constructor: my_int = 0) Call 4 (copy constructor: my_int = 1)
Warum die zusätzlichen Aufrufe?
Intern reserviert ein Vektor normalerweise eine bestimmte Menge an Speicher Lagerung. Wenn der zugewiesene Speicherplatz erschöpft ist, muss der Vektor mehr Speicher neu zuweisen. Diese Neuzuweisung löst eine Kopie der vorhandenen Elemente in den neuen Speicher aus.
Im angegebenen Code erfordert der zweite push_back eine Neuzuweisung. Obwohl der Konstruktor für Myint nur zweimal aufgerufen wird, wird der Kopierkonstruktor dreimal verwendet. Dies liegt daran, dass der Kopierkonstruktor verwendet wird, um das erste Element in den neu zugewiesenen Speicher zu verschieben, initialisiert mit seinem ursprünglichen Wert (my_int = 0), und dann der Kopierkonstruktor erneut aufgerufen wird, um das zweite Element zu erstellen, initialisiert mit dem aktualisierten Wert ( my_int = 1) Durch die anfängliche Kapazität des Vektors können Sie eine Neuzuweisung verhindern und Kopiervorgänge minimieren.
Verwenden Sie Emplace_back:Mit dieser Methode können Sie ein Element direkt an Ort und Stelle konstruieren und so Kopien oder Verschiebungen vermeiden.
Das obige ist der detaillierte Inhalt vonWarum löst „push_back' mehrere Kopierkonstruktoraufrufe in einem Vektor aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!