std::set<> - nicht immer sortiert?



  • Hallo Forum,

    folgendes Szenario:

    print(const std::set<int>& data) { /* gibt den Inhalt von data aus */ }
    
    int main() {
        std::set<int> s;
        s.insert(2);
        s.insert(3);
        s.insert(4);
        print(s);    // Ausgabe: 2 3 4 - OK soweit
    
        *s.find(3) = 1; // Sorry für die fehlende Fehlerprüfung - würde nur ablenken
        print(s);    // Ausgabe: 2 1 4 - NICHT sortiert???
    }
    

    Wie kann man Werte in einem set ändern, und veranlassen, dass sich der Container wieder selbst sortiert?

    Grüße



  • erase()/insert()



  • @daersc:
    Dass set<>::find einen non-const Iterator zurückgibt, ist IMO etwas unvorteilhaft.
    Der Grund ist vermutlich, dass man ermöglichen wollte, Teile eines Keys "in place" zu ändern, die für die Sortierung nicht relevant sind.

    Sobald man aber etwas verändert, was für die Sortierung relevant ist, bricht man den Kontrakt mit std::set. D.h. man "darf" es nicht machen.

    Wenn du willst dass die Sortierung erhalten bleibt, musst du wie DocShoe schon geschrieben hat das Element aus dem Set entfernen und dann neu hinzufügen.

    BTW: In der Boost gibt es eine nette Library namens MultiIndex. Diese hat eine Funktion zum "in-place" Modifizieren von Keys, also ohne dass man dazu das Element entfernen + neu hinzufügen müsste.
    Wobei das keine Empfehlung sein soll, die MultiIndex Library ist für deine Anwendung vermutlich Overkill.


Anmelden zum Antworten