hash_multimap erase, Gültigkeit von Iteratoren
-
Ich habe eine hash_multimap, aus der ich Elemente entfernen will. Auswahlkriterium ist der value, d.h. alle Elemente mit value x sollen entfernt werden. Ich habe die naive Variante versucht, d.h. in einer for Schleife mit einem Iterator über die Elemente gehen und wenn value entspechend erase(it) aufrufen. Das geht nicht, hab ich gemerkt; momentan bin ich bei folgender Lösung:
//( _adjcs -> hash_multimap,edge_itr_del -> hash_multimap::iterator) edge_itr_del it = _adjcs.begin(); while(it != _adjcs.end()) { if((*it).second == vertex) { _adjcs.erase(it); it = _adjcs.begin(); } else{++it;} }Allerdings ist das wirklich hässlich. Gibts evtl. ne elegantere / effizientere Variante?
-
hash_map und hash_multimap sind nicht im c++ standard enthalten und dementsprechend unterscheiden sich diese von hersteller zu hersteller
-
Ja, bedauerlicher Weise. Ich verwende im Moment die aus der mingw Bibliothek, sprich GNU.
-
Aber eins gilt afaik für (fast) alle Container - der Iterator, den du löschst, wird auf jeden Fall ungültig.
Eine schnellere Variante wäre es sicher, die zu löschenden Elemente mit der find()-Methode (oder, wenn vorhanden, mit equal_range()) der Hash-Map zu finden.
-
Soweit ich die hash_multimap verstanden habe, kann man da nach Schlüsseln suchen (es gibt find(), auch equal_range()), ich suche allerdings nach Werten. Ich hatte die Idee, den Iterator vor dem Test auf Gleichheit zu inkrementieren und zu speichern und, falls das Iteratorziel gelöscht wird mit dem gespeicherten Wert weiterzumachen, aber damit hatte ich keinen Erfolg.. ich habe mir damit die halbe map gelöscht (Warum eigentlich? Andere Iteratoren sollten doch gültig bleiben? Implementationsabhängig?).
-
Das kommt ganz auf die Implementation des Containers an, welche Iteratoren wann gültig bleiben (z.B. zerlegt vector::erase() alle Iteratoren hinter der Löschposition).
-
Hast du es so gemacht:
container.erase(it); ++it;oder so:
container.erase(it++);?
Wie schon meine Vorredner angemerkt haben, kommt es immer auf den Container an, aber zweitere Variante wäre z.B. bei einer map korrekt, erstere natürlich nicht.