000
09.06.2004, 21:30 Uhr
tim
|
Hallo alle zusammen!
Ich hab da ein Problem mit der STL multimap. Ich möchte Einträge in der map anhand der abgelegten Werte (nicht der Schlüssel!) löschen. Hab mal ein kleines Prog gebastelt um das zu verdeutlichen:
C++: |
#pragma warning( disable: 4786 ) // identifier truncated in debug info
#include <map> #include <iostream>
using namespace std;
struct person_t { char* name; int alter; };
typedef multimap<int, person_t> pers_map_t;
pers_map_t pers_map;
void add( int index, char* name, int alter ) { person_t person = { name, alter }; pers_map.insert( pers_map_t::value_type( index, person ) ); }
void print() { for( pers_map_t::iterator i = pers_map.begin(); i != pers_map.end(); ++i ) cout << i->first << ": " << i->second.name << " " << i->second.alter << endl; cout << endl; }
void del( int alter ) { for( pers_map_t::iterator i = pers_map.begin(); i != pers_map.end(); ++i ) if( i->second.alter == alter ) pers_map.erase( i ); }
int main( int argc, char* argv ) { // erstmal was reinpacken in die map add( 0, "Klaus", 32 ); add( 2, "Ina", 45 ); add( 1, "Miriam", 29 ); add( 2, "Rolf", 32 );
// schauen, ob's wirklich drin ist print();
// alle löschen, die 32 sind del( 32 );
// schauen, was dann noch drin ist print();
return 0; }
|
Blöd nur, daß del() nicht so funktioniet, wie ich mir das dachte: Speicherschutzverletzung ... . Dass STL Zeug läßt sich echt doof debuggen, aber ich vermute, der Iterator wird irgendwie ungültig oder verändert, wenn man was in der map löscht. Also hab ich das mal anders versucht:
C++: |
void del( int alter ) { pers_map_t::iterator i = pers_map.begin();
while( i != pers_map.end() ) { if( i->second.alter == alter ) { pers_map.erase( i ); i = pers_map.begin(); } else ++i; } }
|
Scheint auch zu funktionieren (zumindest stürzt es nicht ab). Blöd ist nur, jedesmal die map von vorn zu durchsuchen. Das artet im worst case in quadratischen Aufwand aus. Und ich hab extra eine map genommen, weil mich viele Eintäge erwarten.
Hat vielleicht irgendwer eine Idee, wie man das etwas effizienter bewerkstelligen könnte? Wäre Euch echt dankbar!
Gruß, Tim
PS: Ich nehm die STL Implementierung von MS, die mit dem Visual Studio 6.0 mitkommt, falls das eine Rolle spielt. |