Ist std :: vector :: reserve (0); legal?

8

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

    
NPS 07.11.2014, 18:06
quelle

7 Antworten

20

Es gibt nichts zu verbieten. Der Effekt von reserve ist:

  

Nach reserve () ist Kapazität () größer oder gleich dem Argument von reserve if   Reallokation geschieht; und ansonsten gleich dem vorherigen Wert von capacity (). Reallokation geschieht   an dieser Stelle genau dann, wenn die aktuelle Kapazität geringer ist als das Argument der Reserve (). 1

Da der Wert von capacity() niemals kleiner als 0 sein kann (er ist nicht vorzeichenbehaftet), kann dies niemals Auswirkungen haben. es kann nie eine Neuzuweisung verursachen.

1. c ++ -Standard, [vector.capacity]

    
Jerry Coffin 07.11.2014, 18:11
quelle
6

Ja, es ist eine legale No-Op.

  

Wenn new_cap größer ist als die aktuelle capacity() , wird neuer Speicher zugewiesen, andernfalls führt die Methode nichts aus.

( Quelle , Hervorhebung von mir.)

Da capacity() immer & gt; = 0 ist (weil size_type nicht vorzeichenbehaftet ist), ist die Übergabe einer Null garantiert nichts.

    
cdhowie 07.11.2014 18:08
quelle
2

Gemäß dem C ++ Standard

  

Nach reserve () ist Kapazität () größer oder gleich dem Argument von   reservieren, wenn Neuzuteilung passiert; und gleich dem vorherigen Wert von   Kapazität () andernfalls. Die Neuzuweisung erfolgt jetzt und nur dann   wenn die aktuelle Kapazität kleiner ist als das Argument von reserve () .

Also wird es einfach keine Umverteilung geben, wenn das Argument der Reserve gleich 0 ist.

Die Funktion selbst löst nur in einem Fall eine Ausnahme aus

  

löst aus: length_error wenn n & gt; max_size ().

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

    
Vlad from Moscow 07.11.2014 18:15
quelle
2

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

    
marsh 07.11.2014 18:07
quelle
1

Die Dokumentation liefert dazu eine klare Antwort:

  

Erhöhen Sie die Kapazität des Containers auf einen Wert, der größer oder gleich new_cap ist. Wenn new_cap größer als die 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 Übergabe von Null für new_cap immer in die zweite Kategorie - d. H. Wenn die Funktion nichts tut.

    
dasblinkenlight 07.11.2014 18:09
quelle
1
%Vor%

Wenn n größer als die aktuelle Vektorkapazität ist, bewirkt die Funktion, dass der Container seinen Speicher neu zuordnet und seine Kapazität auf n (oder höher) erhöht.

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

    
ravi 07.11.2014 18:09
quelle
0

Zunächst 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.

Falls Sie Ihrem Vektor einen weiteren Wert hinzufügen wollen und der Reservierungsraum Null ist, wird es ohne Probleme 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.

    
Federico Navarro 07.11.2014 18:32
quelle

Tags und Links