2014-11-07 5 views
8

Ist std::vector::reserve(0); legal und was wird es tun?Ist std :: vector :: reserve (0); legal?

+0

Ich glaube, es ist legal und wahrscheinlich nichts tun. –

+0

Wir können davon ausgehen, dass die Größe (und, noch wichtiger, die Kapazität) ** ** Null oder größer sein wird. –

+0

@MikeSeymour Ja, ich wollte etwas anderes sagen, aber es kam falsch heraus. Ich habe diesen Teil einfach entfernt. : P – NPS

Antwort

20

Es gibt nichts zu verbieten. Die Wirkung von reserve ist:

Nach Reserve(), Kapazitäten() größer oder gleich dem Argument des Reserve wenn Neuzuteilung geschieht; und ansonsten gleich dem vorherigen Wert von capacity(). Reallokation passiert an dieser Stelle, wenn und nur wenn die aktuelle Kapazität ist kleiner als das Argument von reserve().

Da der Wert von capacity() kann nie kleiner als 0 (es ist ohne Vorzeichen), kann dies nie irgendeine Wirkung haben; es kann nie eine Neuzuweisung verursachen.


1. C++ Standard [Vektor.Kapazität]

+1

Ich nehme an, Sie zitieren den C++ Standard hier? Ich denke, Sie sollten das ausdrücklich sagen und die zitierte Version des Standards zur Verfügung stellen. – NPS

+1

Ok, aber ich denke immer noch, du solltest explizit angeben, dass du den C++ - Standard für andere Benutzer zitierst, die später auf deine Antwort stoßen. – NPS

+0

@NPS: Ich denke, die meisten, die sich wahrscheinlich kümmern würden, würden die 'vector.capacity'-Referenz erkennen, aber die Referenz ein bisschen vollständiger zu machen, tut nicht weh, also habe ich sie bearbeitet. –

2

Es ist legal und wird keinen Speicherplatz reservieren. Wenn der Anruf jedoch niedriger als seine Kapazität ist, wird der Anruf nichts tun.

+2

Wenn das Argument 'reserve' kleiner als _or_ gleich der aktuellen Kapazität ist, ist' reserve' ein no-op. Da die Kapazität nicht negativ sein kann, gibt es keine Möglichkeit, dass "0" streng größer ist. –

+2

Sie haben einen Tippfehler: "dann" statt "als". Ich wollte es selbst beheben, aber es besagt, dass die Bearbeitung mindestens 6 Zeichen lang sein muss ... Idiotie ... – NPS

6

Ja, es ist eine legale no-op.

Wenn new_cap größer ist als die aktuellen capacity() wird neuer Speicher, zugeordnet sonst das Verfahren nichts tut.

(Source, Hervorhebung von mir.)

Seit capacity() wird immer> = 0 (wegen size_type ohne Vorzeichen ist), vorbei an einem Null garantiert nichts zu tun.

1

Die documentation bietet eine klare Antwort auf diese Frage:

die Kapazität des Behälters auf einen Wert erhöhen, die new_cap größer oder gleich ist. Wenn new_cap größer als der aktuelle capacity() ist, wird neuer Speicher zugewiesen, andernfalls führt die Methode nichts aus.

capacity() gibt einen Wert zurück, der nicht negativ sein kann. Daher fällt die Nulldurchgabe für new_cap immer in die zweite Kategorie - d.h. wenn die Funktion nichts tut.

+5

Vorsicht: Keine Wiki-Website ist "_the_ documentation" –

1
void reserve (size_type n); 

Wenn n größer als die Kapazität der Stromvektor ist, bewirkt die Funktion der Behälter seine Lagerung erhöht seine Kapazität zu n neu zuzuteilen (oder höher).

In allen anderen Fällen verursacht der Funktionsaufruf keine Neuzuweisung, und die Vektorkapazität ist nicht betroffen.

2

Nach dem C++ Standard

Nach Reserve(), Kapazitäten() größer oder gleich dem Argument des Reserve wenn Neuzuteilung geschieht; und gleich dem vorherigen Wert von Kapazität() sonst. Reallokation passiert an dieser Stelle wenn und nur wenn die aktuelle Kapazität ist kleiner als das Argument der Reserve().

Es wird also nicht einfach eine Umverteilung, wenn das Argument der Reserve auf 0

Die Funktion selbst eine Ausnahme nur in einem Fall wirft

Wirft gleich ist: length_error wenn n> maximale Größe().

Berücksichtigen Sie, dass reserve(0) nicht äquivalent zu resize(0) ist. Im letzten Fall werden alle Elemente des Vektors entfernt.

0

Zuerst sollten Sie versuchen zu verstehen, wie Vector funktioniert. Es ist ein Array, das Speicher reserviert, um es zu verwenden, wenn Sie einen neuen Wert speichern müssen, um den Einfügevorgang schneller und effizienter durchzuführen.

Mit std::vector::reserve() können Sie die Menge an Speicher bestimmen, die Sie reservieren möchten, in Ihrem Fall Null.

Wenn Sie Ihrem Vektor einen weiteren Wert hinzufügen möchten und der Reservefall Null ist, wird es problemlos funktionieren, aber die Operation wird langsamer. Es könnte ein Problem sein, wenn Sie dies für viele Werte tun möchten, aber wahrscheinlich werden Sie dies nicht bemerken, wenn Sie es nur ein paar Mal tun.

Verwandte Themen