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]
Ja, es ist eine legale No-Op.
Wenn
new_cap
größer ist als die aktuellecapacity()
, 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.
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.
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. Wennnew_cap
größer als die aktuellecapacity()
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.
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.
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.