Multimap::iterator und erase



  • Hallo,

    ich muss eine std::multimap durchlaufen und bestimmte Elemente daraus löschen.
    Also z.B. so:

    typedef std::multimap<int, int> MyMap;
    MyMap map;
    
    for (MyMap::iterator iter = map.begin(); iter != map.end(); ++iter)
    {
            if (/*condition*/)
                    map.erase(iter);
    }
    

    Nun sagt aber die Dokumentation von multimap:

    Erasing an element from a multimap also does not invalidate any iterators, except, of course, for iterators that actually point to the element that is being erased.

    Heisst das nun, das mein Code falsch ist, weil "iter" nach dem erase Aufruf ungültig geworden ist, oder heisst das nur, dass man "iter" nach dem erase Aufruf nicht mehr dereferenzieren darf? Falls ersteres richtig ist: Wie müsste der Code korrekt aussehen?


  • Mod

    Johnny schrieb:

    Heisst das nun, das mein Code falsch ist, weil "iter" nach dem erase Aufruf ungültig geworden ist, oder heisst das nur, dass man "iter" nach dem erase Aufruf nicht mehr dereferenzieren darf? Falls ersteres richtig ist: Wie müsste der Code korrekt aussehen?

    ersteres. richtig wäre z.b.

    typedef std::multimap<int, int> MyMap;
    MyMap map;
    
    for (MyMap::iterator iter = map.begin(); iter != map.end();)
    {
            if (/*condition*/)
                    map.erase(iter++);
            else
                    ++iter;
    }
    


  • Erstmal Danke für deine Antwort.
    Ich kann im Moment keinen semantischen Unterschied zwischen deinem und meinem Code erkennen. Der iterator wird doch bei dir genauso wie auch bei mir nach dem erase Aufruf per increment um eins erhöht. Übersehe ich etwas?



  • Johnny schrieb:

    Ich kann im Moment keinen semantischen Unterschied zwischen deinem und meinem Code erkennen. Der iterator wird doch bei dir genauso wie auch bei mir nach dem erase Aufruf per increment um eins erhöht. Übersehe ich etwas?

    Der Iterator wird vom Prinzip her in etwa so implementiert sein:

    struct iterator {
    // ...
      iterator operator++(int) // postfix increment
      {
        iterator result(*this);
        ++(*this);
        return result;
      }
    };
    

Anmelden zum Antworten