STL Set, was ist wenn ein Member verändert wird?
-
Ich hoffe ihr könnt mir bei folgendem Problem helfen.
Ich habe eine Set, sortiert wird nach id (siehe Sortierkriterium).
struct sfoo { int id; //...sonstige Member; }; struct compare { bool operator() (const sfoo& lhs, const sfoo& rhs) const {return lhs.id<rhs.id;} }; set<sfoo,compare> sfooset;Was passiert jetzt in folgendem Fall:
sfooset myset; //.... Set füllen! myset.begin()->id = 20; //Hier muss doch jetzt die Integrietät der set verletzt werden oder?Falls wirklich die Intigrität der set verletzt wird, wie kann ich das Problem lösen?
Falls nicht, wieso nicht?MfG Wally
-
Hallo Wally,
das Problem ist bekannt. Du hast anscheinend eine STL.set-Implementierung, die dem User (also Dir) vertraut, dass Du durch eine Zuweisung die Reihenfolge im set nicht zerstörst - siehe dazu den Artikel von Angelika Langer.
Der Schreibzugriff ist zugelassen, damit die Möglichkeit besteht, auf nicht const Methoden der Elemente im set zuzugreifen. Die Ordnung der Elemente darf dabei aber nicht zerstört werden.
-
Du kannst ja leicht rausfinden, ob die Integrität noch verletzt ist: prüfen, ob das nächstgrößere bzw. nächstkleinere Element (in der alten Sortierung) noch größeren bzw. kleinere id hat (also ob die Sortierung noch korrekt ist). Dazu kannst Du einfach mit dem Iterator auf das Element eins nach links bzw. eins nach rechts rücken und dann schauen. Da mußte dann entweder zwei ifs reinfrickeln wegen it==begin bzw. ++it==end, damit Du nichts liest, was es nicht gibt, oder zwei Dummy-Elemente einfügen, eines mit der kleinstmöglichen ID und eines mit der größtmöglichen, dann haste die Fälle automatisch abgehandelt. Außerdem brauchste strengenommen nicht mit beiden Nachbarn zu vergleichen. Wenn die id sich vergrößert mußte nur den größeren Nachbarn anschaun, andernfalls nur den kleineren.
Wenn es nun inkonsistent wird, mußte das Element löschen und wieder frisch einfügen. Wenn das nicht zu häufig passiert dürfte das immer noch recht flott sein.