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 freigegeben
    

    ja.
    man kanns auch als

    grosser_vector.swap(vector<TYP>());
    

    schreiben, geschmachssache.



  • volkard schrieb:

    ja.
    man kanns auch als

    grosser_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);
    

Anmelden zum Antworten