std::list macht Probleme bei erase oder remove



  • Also erstmal der Quellcode :

    std::list<string> tl;
    	tl.push_back("dlfaldf");
    	tl.push_back("tzr");
    	tl.push_back("toc");
    	string name = "tzr";
    	std::list<string>::iterator i;
    	for(i = tl.begin();i != tl.end();i++)
    	{
    		if(*i== name)
    			tl.remove(*i);//hier fliegt er, egal ob remove, oder erase
    	}
    	for(i = tl.begin();i != tl.end();i++)
    	{
    		cout << *i << endl;
    	}
    

    so, folgendes:
    Ich hab da ne liste, und das soll was gelöscht werden, ist eigentlich
    ein Datentyp, aber mit std::string funzt es auch nicht, auch mit int nicht,
    von daher wirds wohl net an meiner Klasse liegen (so zumindest meine Hoffnung *g*)
    Technisches:
    Ich benutz den MS VC6.0, unter XP, STL Fix ist installiert.

    Der Debugger spukt folgende Aufrufliste aus:
    memcmp() line 88
    std::char_traits<char>::compare(const char * 0x004e1df1, const char * 0xdddddddd, unsigned int 3) line 190 + 41 bytes
    std::basic_string<char,std::char_traits<char>,std::allocator<char> >::compare(unsigned int 0, unsigned int 3, const char * 0xdddddddd, unsigned int 3722304989) line 525 + 55 bytes
    std::basic_string<char,std::char_traits<char>,std::allocator<char> >::compare(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & {0xdddddddd ""}) line 503 + 64 bytes
    std::operator==(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & {0x004e1df1 "toc"}, const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & {0xdddddddd ""}) line 41 + 36 bytes
    std::list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::remove(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & {0xdddddddd ""}) line 280 + 18 bytes
    main(int 1, char * * 0x004e0e70) line 57
    mainCRTStartup() line 206 + 25 bytes

    Hm, anscheinend hängt er in memcmp(...), wo ist diese Funktion definiert ?

    mfg.

    Devil



  • Hi,

    remove sucht die Liste selbsständig ab.

    statt einer Schleife reicht der Aufruf

    tl.remove(name)
    

    dann werden alle elemente==name aus der Liste gelöscht.

    und wenn Du unbedingt mit erase arbeiten willst, dann darfst Du nicht vergessen, daß Dein Iterator mit dem Aufruf quasi 'ungültig' wird, weil er auf ein falsches Element zeigt. Du must den Aufruf in:

    i=tl.erase(i);
    

    umwandeln, damit der Iterator wieder auf die Liste zeigt.

    grüße Con@n



  • So, funktioniert jetzt.

    Danke.

    Devil


Anmelden zum Antworten