list::iterator verwenden nach Änderung der Liste?



  • Hi, ich habe untenstehende Funktion, welche die Liste von Objekten anhand ihrere Distanz zu einem gegebenen Punkt sortiert.
    Da es nicht besonders toll ist die Distanz bei jedem Vergleich auszurechnen wollte ich erstmal eine Liste aus (distanz, iterator) tupeln sortieren und danach die liste entsprechend umsortieren.
    Jetzt weiss ich aber nicht, ob ich das darf, was ich in der letzten Schleife tue. Wenn ich daran denke wie eine Liste funktioniert sollte das eigentlich gehen. Andererseits wenn ich da einen std::vector verwenden würde, ginge das was ich da tue ja garnicht, weil die Iteratoren in den Pairs auf die Falschen elemente zeigen würden (bzw. nach einem erase womöglich sogar auf etwas das garnicht im vector liegt...).
    Verletze ich hier jetzt irgendwelche Regeln zum umgang mit Iteratoren, oder darf ich davon ausgehen, dass die Listeniteratoren auch wirklich so funktioneren wie man das annehmen würde?

    void sortByDistanceFromPosition(std::list<Object*> objects, coords3d position)
    {
      typedef std::pair<double, std::list<Object*>::iterator>  RIpair; 
    
      struct CompareDist {
        bool operator()(const RIpair &a, const RIpair &b)
        { return a.first < b.first; }
      };
    
      std::list<RIpair> RIlist;
    
      for(std::list<Object*>::iterator i = objects.begin();i != objects.end();++i)
        {
          double d = dist((*i)->getPosition(), position) - (*i)->getBoundingRadius(); 
          RIlist.push_back(std::makepair(d, i));
        }
    
      RIlist.sort(CompareDist());
    
      for(std::list<RIpair>::iterator i = RIlist.begin();i != RIlist.end();++i)
        {
          objects.push_back(*(i->second));
          objects.erase(i->second);
        }
    }
    


  • Ist völlig in Ordnung:

    ISO/IEC 14882, §23.2.2.3 schrieb:

    list modifiers: [...]
    Notes: Does not affect the validity of iterators and references. If an exception is thrown there are no effects



  • Bestens, danke.


Anmelden zum Antworten