Löschen eines Mapelements über eine Referenz
-
Hallo zusammen,
in den Letzten wochen hat mir das Forum hier sehr geholfen, sowohl als Nachschlagewerk, als auch aktiv wenn ich mal garnicht weitergekommen bin.
Nun hänge ich mal wieder, vieleicht kann mir nochmal jemand unter die Arme greifen.
Folgendes Problem:einer Funktion wurde (by reference) ein vector von Maps, von einem Struckt übergeben. also folgendes:
vektor< map< unsigned int, myStruct > > myStructs
Folgender Funktion sollen nun einzelne elemente der Map gelöscht werden:
void myFunct(vector< map<unsigned int, myStruct> > &myStructs)
wie lösche ich nun ein Element der map? die Kombination aus Konrainern und Referenzwerten ist dann doch ein bisschen komplizierter als ich mir das vorgestellt hatte...
Gruß
-
Mit erase... wiebei jeder normalenmap auch.
Lösche aus der Map in vector Position 0, das Element mit Wert x:
myStructs[0].erase(x);
-
Danke für den Tipp, aber ich bekomme eine Fehler meldung (Expression map/set iterator not incrementable). oder habe ich deine Lösung einfach falsch umgesetzt?
Hier mal ein konkreter Queltextausschnitt:
for(map<unsigned int, myStruct>::iterator i = myStructs[part].begin(); i != myStructs[part].end(); ++i) { if((*i).second.max.y == border-1) { for(map<unsigned int, myStruct>::iterator j = myStructs[part+1].begin(); j != mystructs[part+1].end(); ++j) { if((*j).second.min.y == border) { if( (*i).second.min.x < (*j).second.max.x && (*i).second.max.x > (*j).second.min.x) { if((*j).second.min.x < (*i).second.min.x) { (*i).second.min.x = (*j).second.min.x; } if((*j).second.max.x > (*i).second.max.x) { (*i).second.max.x = (*j).second.max.x; } if((*j).second.max.y > (*i).second.max.y) { (*i).second.max.y = (*j).second.max.y; } //unteres struct löschen myStructs[part+1].erase(j); } } } } }
?
-
Wo?
-
genau an der besagten stelle:
myStructs[part+1].erase(j);
wenn ich die auskommentiere, lauft das programm ohne zu mucken
-
Wenn du den Iterator löschst (genauer das Element mit dem er verbunden ist), gehört er (der Iterator) nicht mehr zur map (ein ++ ist also sinnlos).
-
aha, wenn ich dich richtig verstehe bekomme ich die Fehlermeldung, da ich, nachdem ich das map-element gelöscht habe, auch gleichzeitig den Iterator gelöscht habe, und dadurch beim nächsten Schleifendurchlauf Probleme bekomme.
Ich sege also quasi den Ast ab auf dem ich sitze...okay, dann kann ich innerhalb der Schleife garkein mapelement löschen?!Es muss doch irgendwie möglich sien ein Element zu löschen wenn ich die Map durchlaufe.
-
Für erase gibt es auch eine Überladung die ein key Element nimmt. Ich weiss aber nicht wie sich das verhält. Weil du änderst die map während du ihre Elemente durchläufst.
Schau dir mal http://www.cplusplus.com/reference/algorithm/remove_if/ an. Ist vielleicht genau das was du brauchst.
Wenn gar nichts hilft kommst du halt nicht drum herum dir die zu löschenden key Elemente zu speichern.
-
erase gibt in der MS Implementierung einen neuen iterator für dasnächste Element nach dem gelöschten zurück.
Du darfst dann im Fall des Löschens nur kein ++j machen!