schrumpft einen Vektor

7

Ich habe ein Problem mit meiner Gelände-Engine (mit DirectX).

Ich verwende einen Vektor, um die Scheitelpunkte eines Detailblocks zu halten. Wenn der Block im Detail zunimmt, tut dies der Vektor.

ABER, wenn der Block seine Details verringert, verkleinert sich der Vektor nicht.

Also, meine Frage: Gibt es eine Möglichkeit, die Größe eines Vektors zu verkleinern? Ich habe es versucht:

%Vor%     
Brammie 25.02.2009, 16:02
quelle

4 Antworten

8

Der übliche Trick besteht darin, mit einem leeren Vektor zu tauschen:

%Vor%     
David Thornley 25.02.2009, 16:11
quelle
27

Wenn Sie Elemente aus einem Vektor kopieren, wird kein Speicher freigegeben (da dies Iteratoren in den Containerelementen ungültig machen würde). Sie können den Vektor in einen neuen Vektor kopieren und ihn dann mit dem Original austauschen. Dann wird es keinen Platz verschwenden. Der Swap hat eine konstante Zeitkomplexität, weil ein Swap Iteratoren nicht gegen Elemente der vertauschten Vektoren ungültig machen darf: Er muss also nur die internen Pufferzeiger austauschen.

%Vor%

Es ist bekannt als das "Shrink-to-fit" -Idiom. Übrigens enthält die nächste C ++ - Version eine Memberfunktion "shrink_to_fit ()" für std :: vector.

    
Johannes Schaub - litb 25.02.2009 16:12
quelle
6

Der reservierte Speicher wird nicht reduziert, wenn die Vektorgröße reduziert wird, da dies im Allgemeinen für die Leistung besser ist. Das Verkleinern der vom Vektor reservierten Speichermenge ist genauso teuer wie das Vergrößern der Vektorgröße über die reservierte Größe hinaus, da hierfür Folgendes erforderlich ist:

  1. Fragen Sie den Zuordner nach einem neuen, kleineren Speicherort,
  2. Kopieren Sie den Inhalt vom alten Speicherort und
  3. Sagen Sie dem Zuordner, dass er den alten Speicherort freigeben soll.

In einigen Fällen kann der Zuordner die Zuordnung direkt ändern, dies ist jedoch keineswegs garantiert.

Wenn Sie eine sehr große Änderung in der Größe benötigt haben und Sie wissen , dass Sie nicht möchten, dass der Vektor wieder expandiert (das Prinzip der Lokalität schlägt vor, dass Sie das tun werden, aber natürlich dort) sind Ausnahmen), dann können Sie die vorgeschlagene Auslagerungsoperation von Litb verwenden, um Ihren Vektor explizit zu verkleinern:

%Vor%     
Matthew Xavier 25.02.2009 16:16
quelle
0

Dafür gibt es eine Mitgliedsfunktion, shrink_to_fit. Es ist effizienter als die meisten anderen Methoden, da es nur neuen Speicher zuweist und kopiert, wenn es nötig ist. Die Details werden hier besprochen, Ist shrink_to_fit der richtige Weg, um die Kapazität eines 'std :: vector' auf seine Größe zu reduzieren?

Wenn Sie die libc-Zuweisungsfunktionen nicht stören, ist realloc sogar noch effizienter, es kopiert die Daten nicht in einen Shrink, sondern markiert den zusätzlichen Speicher als frei, und wenn Sie den Speicher vergrößern, ist auch noch Speicher frei Markieren Sie den benötigten Speicher als verwendet und kopieren Sie auch nicht. Seien Sie jedoch vorsichtig, wenn Sie C ++ stl-Templates in C void-Zeiger verschieben und verstehen müssen, wie Zeiger und Speicherverwaltung funktionieren, wird sie von vielen als Quelle für Bugs und Speicherlecks missbilligt.

    
Johan Köhler 23.10.2014 20:20
quelle

Tags und Links