Hjælp til std::multimap

Tags:    c++

Hej

Jeg sidder og roder med et multimap, hvori jeg linker nogle int værdier til pointere..

Jeg har så brug for at slette nogle specifikke keys og deres values.

Min kode der skal slette de entries ser således ud:

Fold kodeboks ind/udKode 


Hvis jeg fjerner den yderste forløkke, så får jeg rigtigt nok fjernet 1 key og dens value, men der er 3 (i dette eksempel, har hardcodet 3 for at koge problemet ned) der tilfredsstiller if sætningen.

chain2 er også en iterator der peger på et entry i mit multimap


Håber i kan hjælpe mig videre :D

På forhånd tak
Troels

Edit:

Ja, det hjælper vist at formulere sit problem for andre, for efter 3timer fandt jeg endelig en måde at løse mit problem:


Fold kodeboks ind/udKode 


Jeg har dog ikke den helt store forståelse for, hvorfor jeg ikke kan referere til chain2 flere gane :S - så hvis der sidder en, der kan forklare mig dette, vil jeg være meget taknemmelig :)



Indlæg senest redigeret d. 01.06.2009 23:18 af Bruger #10853
Jeg forstår heller ikke helt hvorfor.

Du skal være opmærksom på at når du har lavet
map.erase( temp );
Så er temp invalid, fordi temp "peger" på map (er en iterator til map), og du kan ikke bruge temp++.



Jeg er klar over, at temp bliver invalid efter jeg har slettet den. Det er også derfor, at jeg laver break efter det temp peger på slettes fra map.

Når den yderste for løkke så tæller ind op, og den inderste for løkke bliver eksekveret igen så bliver temp vel en valid iterator igen (via temp = map.begin() ) eller er iteratoren helt ubrugelig efter man har brugt den til at slette med ?



Ups, havde ikke kikket ordentlig efter. Det bør være ok.
Kan du lave et komplet eksempel, der ikke virker, så skal jeg kikke på det.



Umiddelbart vil jeg mene at problemet er at de to std::multimap'er er forbundne.
Du har
multimap<int, Chain*>::iterator temp;

Hvis det objekt som Chain* peger på også indgår i chain2 to, har vi problemet.

Jeg kan ikke se hvordan du opretter mapperne, men hvis du har noget i stil med:

Chain* c = new Chain;
temp[1] = c;
chain2[2] = c;
Har vi problemet, for så vil chain2[2]'s second blive invalid når du sletter temp[1].



Jeg har fundet fejlen nu, det element som chain2 peger på, er det element der bliver slettet i andet iteration.. Den havde jeg ikke lige set, doh :(

Koden ser nu således ud:
Fold kodeboks ind/udKode 


Edit:

Ja, det var lige det der var tilfældet, hehe :D
Det er ret svært at holde styr på alle de variable.. puha



Indlæg senest redigeret d. 02.06.2009 00:18 af Bruger #10853
t