prä oder postinkrementieren/dekrementieren in schleifen?



  • @TGGC|_work
    Im C++ Standard findest du unter 23.3.1 "Template class map" im Abschnitt "modifiers" genau drei erase-Funktionen.

    void erase(iterator pos);
    size_type erase(const key_type& x);
    void  erase(iterator first, iterator last)
    

    Und der Standard ist nun mal das Dokument, dass im *Standard*-C++ Forum die größte Relevanz hat. Weleche Doku hat dir denn was falsches suggeriert?



  • Redhead schrieb:

    Wenns "einfach" sein soll, was spricht gegen die Verwendung von remove() mit anschliessendem erase() ??

    Was meinst du? Meinst du das "erase-remove-idiom"? Falls ja, das funktioniert nicht bei assoziativen Containern.



  • HumeSikkins schrieb:

    Und der Standard ist nun mal das Dokument, dass im *Standard*-C++ Forum die größte Relevanz hat.

    Stimmt, die Realität sollte man ignorieren, es gibt nur eine Wahrheit... 😎

    Bye, TGGC (Demo or Die)



  • TGGC|_work schrieb:

    HumeSikkins schrieb:

    Und der Standard ist nun mal das Dokument, dass im *Standard*-C++ Forum die größte Relevanz hat.

    Stimmt, die Realität sollte man ignorieren, es gibt nur eine Wahrheit... 😎

    Nö. Nur sollte man schon prüfen, was Realität ist.
    Schauen wir mal:
    Gnu-STL, STL-Port, SGI-STL, comolib: void erase
    Dinkumware-STL: iterator erase.

    Fazit: Wer ausschließlich mit dem Visual Studio arbeitet oder aber überall eine Dinkumware-STL installiert (erst kaufen), der kann auf einen Rückgabwert vom Typ iterator bauen.
    Wer allerdings nebenbei mit einem gcc, einem sun-cc oder irgendeinem anderen Compiler arbeitet, der sollte in diesem Punkt wohl besser beim Standard bleiben.



  • HumeSikkins ist das hier ok?

    for(MapIterator itr = c.begin(); itr != c.end(); ++itr)
    {
       if(itr->second == "bla")
       {
           c.erase(itr);
       }
    }
    


  • ... schrieb:

    HumeSikkins ist das hier ok?

    for(MapIterator itr = c.begin(); itr != c.end(); ++itr)
    {
       if(itr->second == "bla")
       {
           c.erase(itr);
       }
    }
    

    Nein. Durch die erase-Operation wird der Iterator ungültig. Der nachfolgende Aufruf des Inkrement-Operators führt dann zu undefiniertem Verhalten.



  • Ich bin zwar nicht HumeSikkins, aber trotzdem: nein. c.erase(it) zerlegt den übergebenen Iterator, danach dürfte er nicht mehr auf ein gültiges Element des Containers zeigen - und danach brauchst du viel Glück (und eine stabil implementierte Bibliothek), um noch sinnvoll mit it weiterarbeiten zu können.

    Du mußt deinen Zähl-Iterator also schon weitergerechnet haben, bevor du eine Kopie davon an c.erase() übergeben kannst - und das schaffst du z.B. mit effe_eichelt's Code.



  • Ah 💡 Endlich hab ichs gerafft. Danke. 🙂



  • TGGC schrieb:

    Bitte.

    Bye, TGGC (Demo or Die)



  • TGGC|_work schrieb:

    TGGC schrieb:

    Bitte.

    Bye, TGGC (Demo or Die)

    😃 😕 👎


Anmelden zum Antworten