std::map-Iterator wird ungültig
-
Achja, das hier finde ich viel verständlicher, um zu sehen, was map macht, wenn kein Key vorhanden ist:
MYCLASS_MAP_T classMap; classMap["blabla"] = 27;
-
Bulli schrieb:
Wenn du z.B. an einen Vector mit push_back was dran hängst, ist es eher unwahrscheinlich ein Iterator ungültig wird, weil der Container nicht umorganisiert werden muß...
Muß noch sagen, das das auch nicht ganz richtig ist: sobald natürlich intern ein neues Array mit new angefordert wird, sind auch wieder alle Iteratoren ungültig.
-
Bulli schrieb:
Generell sind Interatoren der Container nicht lange gültig. [...] Erst Recht wenn Du noch ein Element in den Container reinschmeisst, und erst Recht bei map.
Wieso erst Recht bei
std::map? Die Map ist ein Binärbaum, und die Iteratoren, Referenzen und Zeiger auf die einzelnen Elemente sollten eigentlich erhalten bleiben. Gleiches gilt z.B. für den sequenziellen Containerstd::list.Bei sequenziellen Containern sieht man aber auch, dass die Operationen
insert()underase()einen Iterator zurückgeben, um eine Iteration lückenlos zu schliessen. Bei assoziativen haben diese Methoden den Rückgabetypenvoid, wie sollte man also bei einer Durchiteration nach dem Löschen eines Elements reibungsfrei fortfahren können, wenn nicht die alten Iteratoren noch gültig wären?Bulli schrieb:
Muß noch sagen, das das auch nicht ganz richtig ist: sobald natürlich intern ein neues Array mit new angefordert wird, sind auch wieder alle Iteratoren ungültig.
Wobei das auch nur geschieht, wenn die aktuelle Kapazität überschritten wird, was man mit
capacity()abfangen kann.
-
Map ist ein sortierter Container, der stest sortiert ist. Wenn du jetzt einen Wert einfügst, dann wird der auch wieder sortiert und daher können die Iteratoren nicht mehr gültig sein.
Eine Map kannst du, wie üblich durch die Angabe eines Iterator, oder eines Bereiches angeben.
-
drakon schrieb:
Map ist ein sortierter Container, der stest sortiert ist. Wenn du jetzt einen Wert einfügst, dann wird der auch wieder sortiert und daher können die Iteratoren nicht mehr gültig sein.
Ja, aber es ist kein linearer Speicher. Es ist nicht so, dass Map eigentlich ein Array ist, das nach jeder Einfügung ständig sortiert wird. Vielmehr wird gerade geschaut, wo ein Element einzufügen ist, was auch zum Vorteil für Hashmapping wird.
Die einzelnen Iteratoren werden wohl Zeiger auf die Elemente besitzen. Weil eine Map normalerweise mit einem Binärbaum implementiert ist, müssen bei Einfügungen und Löschungen wie bei einer Liste Zeiger neu verknüpft werden (eben für die Baumstruktur). Die einzelnen Elemente werden ja nicht verschoben, deshalb ist auch kein
operator=für Objekte in assoziativen Containern notwendig. Und deswegen bleiben auch Iteratoren, Zeiger und Referenzen auf die Objekte gültig.Steht übrigens auch im STL-Artikel (siehe zusammenfassende Tabelle unter Punkt 6).
-
Ich kann den Fehler partout nicht finden, sagt jemand folgendes Meldung etwas:
http://www.abload.de/img/crashqol.png
Würde vlt schon weiterhelfen wenn ich die Fehlermeldung deuten könnte

Klicke ich auf "Wiederholen" lande ich hier
http://www.abload.de/img/iterqz2.png
bei "map/set iterators incompatible"
-
mapper2000 schrieb:
Würde vlt schon weiterhelfen wenn ich die Fehlermeldung deuten könnte

Würde evtl. schon reichen, es nur vom Englischen ins Deutsche zu übersetzen. Offensichtlich verwechselst du irgendwo Iteratoren von
std::mapmit solchen vonstd::set, daher kommt die Inkompatibilität. In deinem Code kann ich allerdings nichts dergleichen entdecken, sodass der Fehler womöglich woanders liegt.Geh doch im Debugger bei der Assertion einfach den Stapelrahmen durch, bis du zu der Stelle gelangst, wo sich der Fehler in deinem Code befindet.
-
Wird von verschiedenen Threads her auf die Map zugegriffen?
Simon
-
Dann geh doch im Debugger in die Aufrufliste, sobald der Fehler auftritt, und suche dort die letzte Zeile aus Deinem Sourcecode auf. Dort kannst Du dann nachschauen, was der Iterator enthält. Vielleicht hoilft das bei der Fehlersuche weiter.
-
Nexus schrieb:
mapper2000 schrieb:
Würde vlt schon weiterhelfen wenn ich die Fehlermeldung deuten könnte

Würde evtl. schon reichen, es nur vom Englischen ins Deutsche zu übersetzen. Offensichtlich verwechselst du irgendwo Iteratoren von
std::mapmit solchen vonstd::set, daher kommt die Inkompatibilität.Die Fehlermeldung ist nicht dahingehend zu verstehen, dass hier zwingend map- und set-Ietratoren durchmischt wurden. Intern basieren Iteratoren für sets und maps auf der gleichen Baumstruktur, und der gezeigte Code kann an dieser Stelle nicht entscheiden, ob der Iterator nun zu einem set oder einer map gehört. Die Fehlermeldung besagt also, dass die betreffenden Iteratoren inkompatibel - als wahrscheinlich ungültig - sind und jeder für sich zu einem set oder einer map gehören würde.