"Map/Set Iterator not derefencable" Error
-
Hallo,
warum bekomme ich bei folgendem Code den oben genannten Fehler:
Kunden::iterator en = daten.end(); --en; e_x = en->first; e_y = en->second; Kunden::iterator next; for(Kunden::iterator bz = daten.begin(); bz != daten.end(); bz++) { next = daten.upper_bound(bz->first); if(next->first < e_x) { abstand = next->first - bz->first; //hier bekomm ich den Error // usw. } }Danke schon mal!
-
Was ist denn "Kunden"?
Ansonsten sehe ich in diesem Fragment keine Fehler, vermutlich liegt das Problem woanders.PS: Was soll dieser Code eigentlich bewirken?
-
Kunden ist eine <int, int> Map.
Durch den Code soll ein Eintrag auf den nächsten überprüft werden und dabei die differenz (abstand) verglichen werden.
-
Wenn bz auf den letzten Eintrag der Map zeigt, liefert
next = daten.upper_bound(bz->first);daten.end(). Dieser Iterator ist nicht dereferenzierbar - allerdings solltest du den Fehler schon in der Zeile
if(next->first < e_x)bekommen.
-
Und der Code dort oben ist komplett? Dort werden die beteiligten Iteratoren schon vorher verwendet und dereferenziert, also muß es einen anderen Grund geben, warum das innerhalb des if-Blocks nicht mehr funktioniert.
[quote="Osterhasenmann"]Durch den Code soll ein Eintrag auf den nächsten überprüft werden und dabei die differenz (abstand) verglichen werden.

und was ist der Sinn dahinter?
(btw, am Ende der Schleife wird next==daten.end() und dann fliegt dir das Programm um die Ohren)
-
und wie kann ich das beheben? Wenn next==daten.end() wird soll er mit der Abfrage fertig sein und die For-Schleife beenden.
-
Dann solltest du diese Bedingung in deine Abbruchbedingung aufnehmen. Übrigens ist upper_bound() auch nicht gerade der eleganteste Weg, den Nachfolger eines Iterators zu bestimmen

PS: Ist das eigentlich ein Compiler- oder Laufzeitfehler, über den wir hier reden?
-
if(daten.upper_bound(bz->first)->first < e_x) //e_x entspricht dem letzten Element der Map { next = daten.upper_bound(bz->first); } else { next = daten.lower_bound(bz->first); //provisorisch }Bekomme aber immer noch diesen Laufzeitfehler.
-
Du greifst ja auch immer noch auf einen (potentiell) ungültigen Iterator zu. Stattdessen solltest du lieber überprüfen, ob next != daten.end gilt.
Und wie gesagt, upper_bound() ist dort vermutlich Overkill. Die Schlüssel in der map<> sind eindeutig, also ist der upper_bound(bz->first) gleich dem Nachfolger von bz und lower_bound(bz->first) ist gleich bz.
Ohne Garantie:
Kunden::iterator pos=daten.begin(),next=pos; for( ++next; next!=daten.end(); pos=next++ ) { //mach was mit pos (aktuelle Position) und next (nächsthöhere Position) }
-
Ok, jetzt klappt es!
Danke!
-
Du musst dafür allerdings sicherstellen, dass die Map nicht leer ist.