boost::ptr_map und erase durch iterator



  • Servus,

    meine Problem ist einfach:
    Durch eine Pointer Map durchiterieren, checken ob eine bestimmte bedingung erfüllt ist, und wenn nicht, den Eintrag aus der Map löschen.

    Intuitiver Ansatz:

    for( boost::ptr_map<long, Foo>::iterator i = map.begin(), e = map.end() ; i!=e ; i++)
    {
      if (i->second->isInvalid())
         map.erase(i);
    }
    

    Jetzt weiß ich nicht, ob der iterator duch das erase() invalidiert wird und somit der nächste ++-Aufruf undefiniert sein könnte. ptr_map::erase gibt void zurück, und keinen neuen Iterator.

    Wie kann ich sicherstellen, dass das funktioniert?

    Gruß,
    Phil



  • typedef boost::ptr_map<long, Foo> FooMap;
    for( FooMap::iterator i = map.begin(), e = map.end() ; i!=e ; /* nichts */) 
    { 
      if (i->second->isInvalid()) 
         map.erase(i++);
      else
         ++i; 
    }
    

    Das Typedef kann ich nebenbei nur empfehlen (an einem sinnvollen Ort, z.B. in der Klassendefinition). 😉



  • Ahh okay, es funktioniert also genau analog zu std::map.
    Habe gerade meinen alten Forumsbeitrag dazu gefunden, da hatte ich wohl dasselbe Problem: http://www.c-plusplus.net/forum/viewtopic-var-t-is-243529.html

    Danke,
    Phil


Anmelden zum Antworten