Wird vector::capacity() durch resize(0) beeinflusst?



  • Hi!
    Ich muss 1 vector mit Daten in einer Schleife füllen (vom Anfang an kenne ich das Maximum der Anzahl der Daten). Nach der Schleife muss der vector geleert um später wieder erneut Daten zu füllen. Das Problem ist, dass ich nicht immer wieder Speicherplatz reservieren will wegen Geschwindigkeitsgründen. Der vector muss immer Speicherplatz für mindestens n Elemente haben. Hilft mir resize(0) dabei?
    Beispiel:

    class x {
        vector<d> vd;
    public:
        x(int n = 0) { vd.reserve(n); } // reserviere Speicherplatz wenn der User n kennt
    void fill_vd() {
        /*...*/...vd.push_back(daten);.../*...*/
    }
    void process_and_reset() {
        /*...*/
        vd.resize(0); // wird capacity beeinflusst? oder nicht?
    }
    };
    


  • Überschreibe doch die alten Daten einfach.
    Dann bist du das Problem mit dem löschen und deine Sorge
    um die Performance los.
    Das geht natürlich nur reibungslos wenn die Anzahl der Datensätze
    immer konstant bleibt.



  • Der Speicher des Vectors wird durch das löschen von (allen) Elementen nicht freigegeben. Auch durch resize(..) wird der interne Speicher nicht freigegeben.
    Somit dürfte sich dein Problem gelöst haben.
    Simon


  • Mod

    Der einzige Weg, die Kapazität eines vectors zu verändern, ist der Einsatz von swap (streng genommen widerspricht sogar das dem Wortlaut des Standards, das ist aber ein Defekt, der im nächsten Standard korrigiert sein wird - nur so kann konstante Komplexität erreicht werden.). resize(0) gibt also keinen internen Speicher des vectors frei - clear() dürfte allerdings etwas klarer sein.



  • simon.gysi schrieb:

    Der Speicher des Vectors wird durch das löschen von (allen) Elementen nicht freigegeben. Auch durch resize(..) wird der interne Speicher nicht freigegeben.
    Somit dürfte sich dein Problem gelöst haben.
    Simon

    Ok, also clear() ist eine gute Lösung. Gott, vector ist aber geil!


Anmelden zum Antworten