"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.


Anmelden zum Antworten