Mehrdimensionale Container löschen



  • und was funktioniert an

    con.erase(con.begin(),con.end());
    nicht??

    das ist nämlich eigentlich richtig.



  • das:
    [C++ Fehler] Procedur.cpp(141): E2285 Keine Übereinstimmung für 'deque<deque<AnsiString,allocator<AnsiString> >,allocator<deque<AnsiString,allocator<AnsiString> > > >::erase(_Deque_iterator<deque<deque<AnsiString,allocator<AnsiString> >,allocator<deque<AnsiString,allocator<AnsiString> > > >,_Nonconst_traits<deque<deque<AnsiString,allocator<AnsiString> >,allocator<deque<AnsiString,allocator<AnsiString> > > > > >,_Deque_iterator<deque<deque<AnsiString,allocator<AnsiString> >,allocator<deque<AnsiString,allocator<AnsiString> > > >,_Nonconst_traits<deque<deque<AnsiString,allocator<AnsiString> >,allocator<deque<AnsiString,allocator<AnsiString> > > > > > )' gefunden



  • kann es sein, dass container const ist?

    int main()
    {
        deque<deque<int> > arr;
        arr.resize(100);
        arr.erase(arr.begin(),arr.end());
    
    }
    

    das funktioniert perfekt bei mir...

    gib mal n minimalbeispiel dass bei dir nicht funktioniert.



  • aha - da ist der fehler!

    begin() und end()
    und nicht
    begin und end



  • äh, sorry der fehler liegt bei mir. ich hab alles zur veranschlauchung etwas vereinfacht.

    original sieht die methose so aus:

    Procedur & Procedur::DelDataContainer(void)
        {
        DataContainer.erase(DataContainer.begin(), DataContainer.end());    // erste Dimension wird angepasst
            for (int i = 0; i < TableNames; i++)
                {
                DataContainer[i].erase(DataContainer.begin(), DataContainer.end());   // zweite Dimension wird angepasst
                for (int j = 0; j < Colls; j++)
                    {
                    DataContainer[i][j].erase(DataContainer.begin(), DataContainer.end()); // dritte Dimension wird angepasst
                    }
                }
            return *this;
        }
    

    mit () und allem 😞



  • container.erase(container.begin(),container.end());
    reicht.

    es reciht sogar
    container.clear();

    dadurch werden alle members gelöscht!



  • hm, dann bleibt der speicher aber belegt. (sagt zumindest good old kumpel Task manager)...

    Naja, zumindest hab ich nciht mehr alles von vorher drinnen, das ist auch schon mal was!

    thx!



  • Original erstellt von ClippingError:
    **hm, dann bleibt der speicher aber belegt. (sagt zumindest good old kumpel Task manager)...
    **

    jup das ist so eine optimierung, für den fall das er neue elemente reinbekommt hat er dan schon speicher
    wenn du den speicher frei geben willst gibts dazu ein trick

    {
        std::vector<int> leer; // wir erzeugen ein leeren vector
        leer.swap( voll );     // jetzt tauschen beide ihre daten members
                               // leer bekommt den speicher von voll
                               // und umgekährt bekommt voll den speicher von leer
    
    } // hier wird leer gelöscht und gibt den speicher frei
    


  • hm, habs ausprobiert. der speicher bleibt weiterhin belegt.
    Speicherfreigabe scheint mit wohl so die archisselsverse der container klassen zu sein. nur gut das beim nächsten beschreiben wenigstens der selbe speicher genutzt wird. mein container ist am schluss 20 mb gross, das würde da schnell mal das system lahmlegen.



  • das OS muss den Speicher ja auch nicht gleich zurück nehmen, sondern kann ihn ja vorerst einmal für den prozess reserviert lassen... das erspart bei neuerlichem allokieren zeit - und wenn der speicher knapp ist, dann kann sich das OS den speicher ja jederzeit holen.


Anmelden zum Antworten