wie Werte aus std::set löschen?



  • ja ich weiß... über erase() , aber ganz so einfach mach ich es euch dann doch nicht 😉

    Auf folgendes Szenario bin ich schon desöfteren gestoßen:

    for ( std::set<Widget>::iterator iter = mySet.begin(); iter != mySet.end(); ++iter )
    {
        if ( ( *iter ).methode() != gewuenschter_wert )
        {
            // raus damit
        }
    }
    

    ein mySet.erase( iter ) wird mir da recht schnell mit einem Zugriffsfehler quittiert.

    Mein derzeitiger Workaround ist, dass ich die zu entfernenden Inhalte in einem zweiten, temporären set speichere, dass ich danach durchlaufen und aus dem ursprünglichen set mittels erase( *iter ) lösche.
    Funktioniert zwar wunderbar, allerdings ist dieser erase deutlich langsamer als das direkte rauslöschen des Iterators (zumindest, wenn ich die Fußnote auf cplusplus.com richtig deute)

    meine zweite Idee war dann, dass ich einfach die Iteratoren in einer Liste abspeicher und so dann rauslöschen kann... endete aber wie erwartet wieder im Nirvana...

    wie kann ich am Besten sowas bewerkstelligen, ohne unnötige Laufzeiteinbußen in Kauf nehmen zu müssen?



  • if(iter->methode() != gewuenschter_wert)
    {
        mySet.erase(iter++);
    }
    else
    {
        ++iter;
    }
    


  • danke... hab ich mal wieder zu kompliziert gedacht


Anmelden zum Antworten