Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » STL multimap iterator

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.06.2004, 19:53 Uhr
virtual
Sexiest Bit alive
(Operator)


Es sollte effizienter sein, eine temporäre Map zu erzeugen, also sowas in der Art:
1. Alle Einträge, die nicht gelöscht werden sollen, in die temp. Map kopieren
2. Anschließend die temp. Map der ursprünglichen zuordnen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: