STL-Container: Probleme beim loeschen...



  • Hi... hab ein kleines Problem, da ich einen stl-container traversiere (ein std::vector, aber ich wollte ihn spaeter noch mit einer std::list ersetzen), und dabei einige Elemente herausloesche... Das Programm ist immer abgestuerzt, ich hab mir also folgendes kleines Testprogramm geschrieben:

    #include <list>
    #include <iostream>
    using namespace std;
    
    const int N = 100;
    
    struct foo
    {
    	int i;
    	foo(int x) : i(x) {}
    };
    
    int main()
    {
    	list<foo> l;
    	for (int i = 0; i < N; ++i)
    	{
    		l.push_front(foo(i));
    	}
    
    	for (list<foo>::iterator it = l.begin(); it != l.end(); ++it)
    	{
    		if (it->i == 55)
    		{
    			l.erase(it);
    		}
    		cout << it->i << endl;
    	}
    
    	cin.get();
    	return 0;
    }
    

    Ergebnis: nach 55 bricht das Programm einfach ab, was auch irgendwo logisch ist (glaub ich), da die for-Schleife ja den bereits geloeschten Iterator inkrementierten will... Nur: wie kann ich das umgehen? 😕



  • it = l.erase(it);
    erase liefter das nächste Element nach dem gelöschten zurück.



  • Hi,

    mal so ein Gedankengang:

    list<int> menge;
    // Liste füllen
    list<int>::iterator ende;
    ende = remove(menge.begin(), menge.end(), 3); // Alle 3en aus der Menge entfernen
    
    //Achtung! Menge ist genauso gross wie vorher!
    menge.erase(ende, menge.end());  // jetzt sind die überflüssigen Elemente entfernt
    

    MfG


Anmelden zum Antworten