set + compare



  • Hi,
    std::set nimmt als zweiten template-parameter einen Comparator, ueblicherweise mit einer "kleiner"-Semantik. Wie ist das aber mit Vergleichen auf Gleichheit? Meiner Meinung nach muss man in einem set in diversen Situationen auf Gleichheit pruefen, wird da einfach der default-operator == genommen oder gibt es einen "Trick", um nur mit Hilfe von "<" auf Gleichheit schliessen zu koennen (die Negation liefert ja "groesser-gleich", wenn man da jetzt nicht auch ein "groesser" hat kommt man nicht auf Gleichheit oder, selbst wenn man das naechste Element in der Ordnung noch mit einbezieht schaffe ich es gerade nicht wirklich)?
    Wenn ersteres der Fall ist, finde ich das etwas seltsam, warum sich der eine Vergleicher konfigurieren laesst, der andere aber nicht. Klar, bitweises Vergleichen geht immer und der operator == wird auch ggf. vom Compiler generiert, wohingegen '<' intuitiv nicht immer eine Semantik hat. Aber ist das der einzige Grund?

    lessorequal



  • Übergib als Parameter doch einfach std::equal_to<T>?!


  • Mod

    Wenn A weder größer noch kleiner ist als B, werden A und B wohl gleich sein.

    edit: Und der Vergleichsoperator wird übrigens nie automatisch generiert.



  • SeppJ schrieb:

    Wenn A weder größer noch kleiner ist als B, werden A und B wohl gleich sein.

    *ouch* wohl wahr. Zu frueh am Morgen... Danke.



  • Eher wenn A nicht kleiner als B ist und B auch nicht kleiner als A ist.

    bool AgleichB = !(A < B) && !(B < A)
    

    Die assoziativen STL Container vergleichen auf Äquivalenz.



  • Und wie wird das bei std::string gemacht? Dort gibt es doch gar keinen operator< und es funktioniert trotzdem?! Und auch wenn es einen geben würde, wie will man vergleichen ob "hallo" kleiner als "pferd" ist?

    Gruß





  • Und auch wenn es einen geben würde, wie will man vergleichen ob "hallo" kleiner als "pferd" ist?

    Schonmal überlegt wie die das im Wörterbuch machen?



  • Wie sortierst du denn Sonder- und Interpunktionszeichen? Kommt das @ bei dir nach dem a? Es wird hier zwar wohl die ASCII-Rangfolge verwendet, dennoch..

    Gruß



  • SeppJ schrieb:

    Wenn A weder größer noch kleiner ist als B, werden A und B wohl gleich sein.

    Nur wenn es eine strikte Ordnung ist.


  • Mod

    knivil schrieb:

    SeppJ schrieb:

    Wenn A weder größer noch kleiner ist als B, werden A und B wohl gleich sein.

    Nur wenn es eine strikte Ordnung ist.

    Ja, das wollte ich noch dabei schreiben, weil dies Voraussetzung für die Benutzung der STL-Algorithmen ist (Standard 23.5) und Leute die das nicht wissen eher verwirrt.

    ⚠ Also ganz wichtig für Benutzung der STL: Bei Vergleichsfunktionen immer welche mit strenger schwacher Ordnung wählen. Wer nicht weiß was das ist, sollte mal ein bisschen Googeln was das bedeutet. (Englisch: strict weak ordering)


Anmelden zum Antworten