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.


Anmelden zum Antworten