9 Stimmen

Verhalten der Methode reserve( ) von vector

Ich wollte wissen, wie sich die std::vector::reserve() in folgenden Situationen:

  1. Angenommen, reserve(N) wird sofort mehrfach hintereinander aufgerufen. Wird der frühere reserve(N1) aufaddiert oder überschrieben werden?
  2. Wenn der frühere reserve(N1) wird mit dem letzten Aufruf überschrieben, Was passiert dann, wenn der letzte reserve(Nn) eine geringere Anzahl von Steckplätzen verlangt?
  3. Nach der Erklärung vector wenn wir einfach push_back() X-Elemente, und wir nennen dann reserve(N) . Wird die bereits push_back() X Elemente gezählt in N ?
  4. Angenommen, die vector hat einige X geschobene 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 reserve() jetzt ? Wird das Objekt sofort verlagert sofort? Wenn nicht, wie wird der Platz dann reserviert?

13voto

Amber Punkte 473552

reserve() stellt lediglich sicher, dass der dem Vektor zugewiesene Speicher mindestens groß genug, um die Anzahl der als Argument übergebenen Elemente zu enthalten. Also...

  1. Je nachdem, welcher Wert am höchsten ist, wird die Mindestkapazität effektiv reserviert.
  2. Siehe Nr. 1.
  3. Ja.
  4. Der Vektor weist so viel Speicher zu, wenn reserve() wird so oft aufgerufen, wie es notwendig ist, um die Anzahl der an reserve() .

Um aus der aktuellen Norm zu zitieren:

void reserve(size_type n)

Wenn n kleiner oder gleich ist als capacity() , Andernfalls handelt es sich um eine Aufforderung zur Zuweisung von zusätzlichem Speicher. Wenn die Anfrage erfolgreich ist, dann capacity() größer oder gleich ist als n ; sonst, capacity() ist unverändert. In beiden Fällen, size() ist unverändert.

5voto

Alok Save Punkte 196241

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() .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X