Mehrdimensionale Container löschen



  • Hallo.

    Ich habe mir das Tutorial zur Verwendung mehrdimensionaler Container durchgelsen, und komme auch gut damit klar. Nur habe ich jetzt das Problem das ich den Inhalt des Container zu gegebener Zeit gerne löschen würde. Die übliche Methode

    Container.erase(Container.begin, Container.end) ;
    

    funktioniert da leider nicht.

    Ich habe es auch schon mit:

    Container.resize(SizeOfFirstDim);    // erste Dimension wird angepasst
    for (int i = 0; i < SizeOfFirstDim; i++)
     {
     Container[i].erase(Container.begin(), aContainer.end());   // zweite Dimension wird angepasst
     for (int j = 0; j < SizeOfSecDim; j++)
      {
      Container[i][j].erase(Container.begin(), Container.end()); // dritte Dimension wird angepasst
      }
     }
    

    Der Container wird zwar von einer KLasse gebildet die auch brav einen Destruktor hat, aber leider bleibt wohl der Speicher belegt (self made Erklärung), denn der Speicher beinhaltet immer auch die alten Daten, wenn diese größer waren als die neuen Daten. (die neuen Daten stehen am Anfang, die alten folgen dann).

    Hat jemand einen Plan wie ich die unerwünschten Daten möglichst gut wieder wegbekomme?
    Danke!



  • was ist denn container für ein typ?



  • ein deque container!



  • ja was denn?
    deque<deque> container
    deque container[2];
    oder ähnliches...

    es gibt viele möglichkeiten einen container mehrdimensional zu bekommen.



  • aso 🙂

    es ist ein:

    deque< deque< deque <AnsiString> > > Container;
    


  • 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