Ist std::vector::reserve(0);
legal und was wird es tun?Ist std :: vector :: reserve (0); legal?
Antwort
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]
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
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
@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. –
Es ist legal und wird keinen Speicherplatz reservieren. Wenn der Anruf jedoch niedriger als seine Kapazität ist, wird der Anruf nichts tun.
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. –
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
Ja, es ist eine legale no-op.
Wenn
new_cap
größer ist als die aktuellencapacity()
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.
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. Wennnew_cap
größer als der 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 Nulldurchgabe für new_cap
immer in die zweite Kategorie - d.h. wenn die Funktion nichts tut.
Vorsicht: Keine Wiki-Website ist "_the_ documentation" –
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.
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.
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.
- 1. Ist std :: vector :: insert reserve per Definition?
- 2. C++: std :: vector :: Reserve Reservierung nicht als Zeiger
- 3. std :: vector reserve() und push_back() ist schneller als resize() und Array-Index, warum?
- 4. Ist & vec [0] definiertes Verhalten für einen std :: vector vec?
- 5. Wird ein Aufruf von std :: vector :: clear() std :: vector :: capacity() auf Null setzen?
- 6. std :: vector vs normalen Array
- 7. Std :: Vector Abbruch Problem
- 8. Iterate Mehrere std :: vector
- 9. std :: vector von std :: function
- 10. Gibt es ein Äquivalent von vector :: reserve() für eine std :: list?
- 11. Std :: Vector Iterator Invalidation
- 12. push_back Ausgabe std :: vector
- 13. Warum ist std :: vector :: operator [] 5 bis 10 mal schneller als std :: vector :: at()?
- 14. Warum springt die Laufzeit meines std :: vector zwischen 0 und ~ 16ms?
- 15. ersetzen `std :: VECTOR` mit` std :: array`
- 16. Vererbung von std :: vector
- 17. posix_memalign für std :: vector
- 18. std :: vector Referenzen
- 19. Vergleichsfunktion für std :: vector von std :: arrays
- 20. Konvertieren von std :: array in std :: vector
- 21. Konvertiere R :: vector in std :: vector
- 22. Wie std :: vector verkleinern?
- 23. Eigen und std :: vector
- 24. Wie man zwei std :: vector in einen einzigen std :: vector mit std :: pair kombiniert
- 25. C++ std :: vector unabhängiger std :: Threads
- 26. Initialisieren eines zweidimensionalen std :: vector
- 27. Split std :: wstring in std :: vector
- 28. C++ std :: pair, std :: vector & memcopy
- 29. Kopiere std :: stack in einen std :: vector
- 30. std :: vector :: emplace_back und std :: move
Ich glaube, es ist legal und wahrscheinlich nichts tun. –
Wir können davon ausgehen, dass die Größe (und, noch wichtiger, die Kapazität) ** ** Null oder größer sein wird. –
@MikeSeymour Ja, ich wollte etwas anderes sagen, aber es kam falsch heraus. Ich habe diesen Teil einfach entfernt. : P – NPS