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 bytesHm, 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