STL Container -> Erase..



  • Im folgenden Code wird das Objekte auch wieder ordnugnsgemäss gelöscht:

    std::list<CAllocNodeEx> test;
    test.push_back(CAllocNodeEx("TEST"));
    std::list<CAllocNodeEx>::iterator it =test.begin();
    std::cout << (*tt).GetName().c_str() << std::endl;
    test.erase(it);
    

    in diesem Fall muss ich beim löschen ja das objekt manuel zerstören

    std::list<CAllocNodeEx*> test;
    test.push_back(new CAllocNodeEx("TEST"));
    std::list<CAllocNodeEx*>::iterator it =test.begin();
    std::cout << (*tt)->GetName().c_str() << std::endl;
    delete (*it); // extra delete aufrufen
    test.erase(it);
    

    komm ich da nich drumrum? da CAllocNodeEx eine Abstrakte basisklasse ist, muss ich das wohl so machen? ich frage mich dann wie es bei "clear()" aussieht, damuss ich ja erst jedes objekt iterieren und zerstören doer nich?



  • Für solche Probleme gibt es smart pointer!
    Z.B. boost::shared_ptr



  • jo stimmt;)

    nächstes Problem: Wenn ich elemente von hinten nach vorne löschen will, nehm ich ich den reverse_iterator... Das Problem ist aber das der compiler bei erase mekkert. :

    std::list<CAllocNodeEx>::reverse_iterator tt =test.rbegin();
    std::cout << (*tt).GetName().c_str() << std::endl;
    test.erase(tt);
    

    fehler:
    c:\test\TreeStructure\AllocationEx.h(86): error C2664: 'std::list<_Ty>::iterator std::list<_Ty>::erase(std::list<_Ty>::iterator)' : cannot convert parameter 1 from 'std::list<_Ty>::reverse_iterator' to 'std::list<_Ty>::iterator'
    with
    [
    _Ty=CAllocNodeEx
    ]
    and
    [
    _Ty=CAllocNodeEx
    ]
    and
    [
    _Ty=CAllocNodeEx
    ]



  • Erase erwartet nunmal einen list::terator, und keinen reverse_iteratorlist::iterator. Das sind verschiedene Typen, die sich nicht konvertieren lassen.

    Auf den zugrundeliegenden Iterator greifst Du mit tt.base() zu. Aber Du weißt natürlich, dass wenn Du einen Iterator löscht, eben dieser nicht mehr gültig ist, um weiterzuiterieren, gell? 🙂



  • ao halt;

    l=0;
    			for(tcl::tree<CAllocNodeEx*>::reverse_iterator it2= it.node()->rbegin(); l < 10 ; it2= it.node()->rbegin(), ++l){
    				delete *(--it2.base());
    				it.node()->erase(--it2.base());
    			}
    

    😃


Anmelden zum Antworten