map iterator Problem/Fehler
-
Ich habe im folgenden Code-Ausschnitt einen Fehler sobald ich den Itertor auf .end() meine map setze und in der for Bedingung dann die Überprüfung läuft...scheinbar versteht C++ nicht dass es rum ist und versucht Iter++ durchzuführen
for(Iter=Iter_;Iter!=Results.getAllCostO().end();Iter++){ if(Iter->second>corrected_costs){ d2=Iter->first; Iter=Results.getAllCostO().end(); } }
Ich bekomme jedesmal wenn das Ganze aus der for rausfliegen sollte einen Segmentation fault.
an folgender Stelle in stl_tree.h
_Self operator++(int) { _Self __tmp = *this; _M_node = _Rb_tree_increment(_M_node); return __tmp; }
-
Dir ist wohl nicht klar, wie eine for-Schleife funktioniert.
for(init; cond; expr) body;
wird zu
{ init; while(cond) { body; expr; } }
Dein Iter++ wird somit am Ende nochmal ausgeführt. Benutze einfach break, um die Schleife zu verlassen.
Übrigens: Wenn du statt Iter++ ++Iter schreibst, wird dein Code ein wenig flotter.
-
Necrofighter schrieb:
Ich habe im folgenden Code-Ausschnitt einen Fehler sobald ich den Itertor auf .end() meine map setze
So was macht man ja auch nicht. Was spricht gegen break?
Necrofighter schrieb:
scheinbar
Anscheinend...
Necrofighter schrieb:
versteht C++ nicht dass es rum ist und versucht Iter++ durchzuführen
Natürlich, wie nach jedem Schleifendurchlauf. Warum sollte irgendwas, was du in der Schleife tust, daran etwas ändern?
-
Wenn ich loop through a c++ map google komme ich auf genau die Bauweise.
Warum wird den Iter++ ausgeführt obwohl die Bedingung nicht mehr greift? Ich meine bei
for(int i=0;i>10;++i){ i=10; }
wird der Fehler ja nicht passieren. An anderer Stelle im code laufe ich ja genauso durch meine maps durch.
so zum Beispiel hier:for(iter=InvestCostO.begin();iter!=InvestCostO.end();iter++){ diam=doubleToString(iter->first);int pos =diam.find_first_of(".");diam.erase(pos=pos+2); costs=doubleToString(iter->second); CIniFile::SetValue(diam,costs,"InvestitionskostenOberwasser",name); }
EDIT:
Kann es sein, dass wenn die Schleife von alleine ans Ende läuft es nicht passiert da nach Iter++ die Bedingung greift und man aus der Schleife fliegt?
-
Am Ende des Schleifenkörpers wird erst erhöht und dann überprüft. Lies Dir nochmal PIs Antwort durch.
-
Necrofighter schrieb:
Warum wird den Iter++ ausgeführt obwohl die Bedingung nicht mehr greift?
Die Bedingung wird erst danach geprüft.
Necrofighter schrieb:
Ich meine bei
for(int i=0;i>10;++i){ i=10; }
wird der Fehler ja nicht passieren.
Mach aus dem >, das eigentlich ein < sein müsste, mal ein !=.
Necrofighter schrieb:
An anderer Stelle im code laufe ich ja genauso durch meine maps durch.
"Genauso" im Sinne von "da fummle ich aber nicht am Iterator rum"? Oder wie?
-
Danke Leute!
Weiß auch nicht warum ich nicht einfach break benutzt habe....es passieren leider immer wieder solche noob Fehler
Aber wie immer findet man hier schnell gute Hilfe!!!
-
Theoretisch könntest du auch Iter auf Iter=Results.getAllCostO().end() - 1 setzen. Allerdings ist die Lösung mit dem break besser.
-
und ich würde ++itr verwenden und nicht itr++
aber das nur so nebenbei^^
-
Ja break ist natürlich die Lösung...alles andere ist dirty und bringt ja nix.
Warum muss ++ oder -- denn auf die linke Seite?
-
schau dir dazu mal die unterschiede von prä- und postdekrement an.