Schnellste Möglichkeit, einen Vector zu leeren
-
Hallo, ich habe in meinem Programm einen sehr großen Vector. Diesen möchte ich jetzt leeren. Welche Methode ist dabei die schnellste oder üblichste?
vector<TYP> grosser_vector; //... //Methode 1 vector<TYP> leerer_vector; grosser_vector = leerer_vector; //Methode 2 grosser_vector.resize(0); //Methode 3 grosser_vector.clear(); //Methode 4 grosser_vector.erase( grosser_vector.begin() , grosser_vector.end() ); //Methode5 grosser_vector.assign(0,0); //ich glaube nicht, dass diese Methode wirklich "sauber" ist... //Methode 6 while (!grosser_vector.empty()) grosser_vector.pop_back(); //ich denke, das ist die langsamste Variante //Methode 7 //ähnlich wie Methode 1: vector<TYP> leerer_vector; grosser_vector.swap( leerer_vector );Welche dieser Methoden ist jetzt die schnellste bzw. üblichste?
Anmerkung: Methode 7 habe ich mit in die Liste genommen, da keine der anderen Methoden ja wirklich Speicher freigibt und swap ja normalerweise sehr performant ist. Gibt es auch irgendeinen Weg (nicht destruktor), den Speicher des vectors freizugeben?mfg
-
#3: Allerdings kocht der auch nur mit Wasser und gibts nur zu Bequemlichkeit. Möglicherweise führt der auch nur ein erase(begin(),end()) aus ...
Redest du überhaupt von std::vector?
-
Die übliche ist
std::vector::clear(). In den meisten Fällen füllt man den Container anschliessend wieder, wodurch es schon einen Sinn hat, dass nicht der ganze Speicher freigegeben wird. Ansonsten würde ich mit einem leeren Container swappen, wenn man wirklich einen leeren Vector will.Natürlich hängt das auch vom gegebenen Problem ab. Am besten machst du eine Zeitmessung für deine konkrete Anwendung.
-
Gibt es auch irgendeinen Weg (nicht destruktor), den Speicher des vectors freizugeben?
Falls Du den Speicher freigeben möchtest der nicht mehr genutzt wird musst Du das mit swap(..) machen.
Simon
-
theta schrieb:
Gibt es auch irgendeinen Weg (nicht destruktor), den Speicher des vectors freizugeben?
Falls Du den Speicher freigeben möchtest der nicht mehr genutzt wird musst Du das mit swap(..) machen.
Genauer: Es gibt keinen Weg.

-
Nexus schrieb:
theta schrieb:
Gibt es auch irgendeinen Weg (nicht destruktor), den Speicher des vectors freizugeben?
Falls Du den Speicher freigeben möchtest der nicht mehr genutzt wird musst Du das mit swap(..) machen.
Genauer: Es gibt keinen Weg.

Keinen garantierten, aber swap() funktioniert im Allgemeinen.
-
hustbaer schrieb:
Keinen garantierten, aber swap() funktioniert im Allgemeinen.
Ich meinte damit keinen Weg, ohne den Destruktor aufzurufen. Mit
swap()nutzt man ja die Gegebenheit aus, dass das getauschte Objekt den Speicher am Ende des Scopes über den Destruktor freigibt.Genaugenommen ruft man den Dtor natürlich nicht beim Originalobjekt auf. Aber ich meinte grundsätzlich Freigeben bei
std::vector.
-
also wäre es am besten folgendes zu machen?
vector<TYP> grosser_vector; //... vector füllen { //neuer gültigkeitsbereich vector<TYP> neuer_vector; grosser_vector.swap(neuer_vector); } //hier ist der alte vector leeer und der allokierte Speicher freigegeben
-
vectory schrieb:
also wäre es am besten folgendes zu machen?
vector<TYP> grosser_vector; //... vector füllen { //neuer gültigkeitsbereich vector<TYP> neuer_vector; grosser_vector.swap(neuer_vector); } //hier ist der alte vector leeer und der allokierte Speicher freigegebenja.
man kanns auch alsgrosser_vector.swap(vector<TYP>());schreiben, geschmachssache.
-
volkard schrieb:
ja.
man kanns auch alsgrosser_vector.swap(vector<TYP>());schreiben, geschmachssache.
Nein, man darf Non-Const-Referenzen nicht an temporäre Objekte binden.
Wenn schon, dann so:
vector<TYP>().swap(grosser_vector);