Angenommen, reserve(N)
wird sofort mehrfach hintereinander aufgerufen. Wird der frühere reserve(N1)
aufaddiert oder überschrieben werden?
Anders als std::string
ist es nicht möglich, die reserve()
pour std::vector
zur Verkleinerung der capacity()
.Aufrufen reserve()
mit einem Argument, das kleiner ist als die aktuelle capacity()
ist ein No-op. Daher ist die letzte reserve()
Anruf, der die derzeitige Kapazität erhöht, wird beibehalten.
Wenn der frühere reserve(N1)
mit dem letzten Aufruf überschrieben wird, was passiert dann, wenn der letzte reserve(Nn)
eine geringere Anzahl von Steckplätzen verlangt?
Aufruf von reserve()
mit einem Argument, das kleiner ist als die aktuelle capacity()
ist ein No-op.
Nach der Deklaration des Vektors, wenn wir einfach push_back() X Elemente haben, und dann rufen wir reserve(N). Werden die bereits push_back() X Elemente in N gezählt?
reserve()
weist (reserviert) einfach eine ausreichende Anzahl von Elementen zu, also Ja. Beachten Sie, dass nach dem Aufruf von reserve()
nur die capacity()
des Vektors wird die size()
Wenn Sie so viele Elemente erstellen und nicht nur Speicher reservieren möchten, sollten Sie die Funktion resize()
.
Angenommen, der Vektor hat einige X
geschobenen Elemente und wenn wir nun push_back()
1 weiteres Element (X+1)
dann müsste dieses Objekt verlagert werden; aber wir haben noch keine push_back()
. Was passiert, wenn wir die reserve()
jetzt? Wird das Objekt sofort verlagert? Wenn nicht, wie wird der Platz dann reserviert?
Ja, die Verlagerung wird stattfinden, aber es kommt darauf an. Wie bereits gesagt, reserve()
weist genügend Speicher zu, um so viele Elemente wie das übergebene Argument zu speichern. Wenn also diese Anzahl von Elementen größer ist als die, die im aktuellen Vektor untergebracht werden kann capacity()
wird die Umsiedlung stattfinden.
Standard-Referenzen:
C++03 23.2.4.2 Vektorkapazität [lib.vector.capacity]
void reserve(size_type n);
Auswirkungen: Eine Richtlinie, die einen Vektor über eine geplante Größenänderung informiert, so dass er die Speicherzuweisung entsprechend verwalten kann. Nach reserve()
, capacity()
größer oder gleich dem Argument der Reserve ist, wenn eine Neuzuweisung erfolgt, und gleich dem vorherigen Wert von capacity()
sonst. Eine Neuzuweisung findet nur dann statt, wenn die aktuelle Kapazität kleiner ist als das Argument von reserve()
.
Komplexität: Sie ändert die Größe der Sequenz nicht und benötigt höchstens lineare Zeit in Bezug auf die Größe der Sequenz.
Wirft: length_error wenn n > max_size()
.248)
Anmerkungen: Eine Neuzuweisung macht alle Verweise, Zeiger und Iteratoren ungültig, die sich auf die Elemente in der Sequenz beziehen. Es ist garantiert, dass bei Einfügungen, die nach einem Aufruf von reserve()
bis zu dem Zeitpunkt, an dem ein Einfügen die Größe des Vektors größer machen würde als die beim letzten Aufruf von reserve()
.