Frage

Gibt es eine Möglichkeit, eine std::vector zu geringerer Kapazität, um die Größe, wenn ich nicht mehr zuvor reservierten Platz braucht?

War es hilfreich?

Lösung

Effective STL, von Scott Meyers, Artikel 17:. Verwenden Sie den swap Trick Überkapazitäten zu trimmen

vector<Person>(persons).swap(persons);

Danach ist persons "geschrumpft passen".

Dies beruht auf der Tatsache, dass vector das Copykonstruktor nur so viel wie Speicher reserviert wie für die Elemente benötigt kopiert werden.

Andere Tipps

Wenn Sie mit C 11 ++, können Sie vec.shrink_to_fit() verwenden. In VS2010 zumindest, das macht den Swap-Trick für Sie.

Erstellen Sie einen neuen, temporären, Vektor aus dem bestehend man dann auf dem bestehend man die Swap-Methode aufrufe, in die temporären vorbei. Die vorübergehenden sei (jetzt mit den alten, übergroß, Puffern) out of scope gehen.

Simsalabim, Ihr Vektor hat genau die richtige Größe für den Inhalt.

Wenn das klingt wie eine Menge Kopieren und Zuteilung -. Bedenken Sie, dass das ist, was Vektor jedes Mal tut es trotzdem über seine aktuelle reservierte Grenze realloc hat

[Bearbeiten] Ja, ich sagte nur das gleiche wie Sebastien in mehreren Wörtern. Ein weiterer Fall von Stackoverflow-Rennen-Zustand; -)

Der Swap-Trick ist ein effektiver Weg, um die Kapazität eines Objekts zu reduzieren, es tauscht den Inhalt meines Vektors mit einem neu kopieren Konstruktion erstellt ein:

vector<Person>(persons).swap(persons);

Beachten Sie, dass es keine Garantie dafür, dass persons.capacity (); nach dem Swap-Trick gleich die Größe: die Kapazität des Vektors (Personen) ist die Fähigkeit, die Bibliothek Umsetzung Reserven Vektoren der Größe persons.size ().

C ++ 11 eingeführt shrink_to_fit () .

shrink_to_fit () sowie der Swap-Trick ist die Kapazität Größe nicht garantieren, ist effektiv reduziert auf die Größe des Vektors.

Wie auch immer shrink_to_fit () kann Ihre Iteratoren ungültig machen (wenn eine Neuzuteilung geschieht) oder nicht: es hängt von der tatsächlichen Implementierung der Bibliothek.

Beachten Sie, dass der Swap-Trick erfordert persons.size () kopieren Konstruktionen von Person und person.size () destructions. Die shrink_to_fit () könnte alle diese Kopieren vermeiden und könnte lassen Sie Ihre Iteratoren gültig. Könnten. Aber von Zeit zu Zeit passiert es, dass shrink_to_fit () implementiert wird in Bedingungen des Swap-Tricks ...

Sie suchen nach einem Äquivalent von QVector :: Squeeze und ich fürchte, es nicht explizit in der STL existiert. Gehen Sie für Sébastien Antwort, ob es richtig für Ihre STL-Implementierung ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top