"Strict Weak Ordering" mit unterschiedlichen Daten



  • Hallo!
    Ich kam neulich in die Verlegenheit, Strukturen mit unterschiedlichen Inhalten zu vergleichen. Bei einigen sind bestimmte Daten nicht vorhanden, bei anderen aber doch, und alle müssen in ein multiset und daher sortierbar sein.
    Meine Frage: Ist folgende Vergleichsfunktion richtig?

    struct MsgFrame
    {
        unsigned long id;
        bool remote;
        unsigned char data[8]; // nur gültig, wenn remote==false
    };
    
    bool isLessThan(const MsgFrame& lhs, const MsgFrame& rhs)
    {
        // Kleinere ID zuerst
        if(lhs.id < rhs.id)
           return true;
        if(lhs.id > rhs.id)
            return false;
    
        // Remote-Frames vor normalen Frames
        if(lhs.remote && !rhs.remote)
            return true;
        if(!lhs.remote && rhs.remote)
            return false;
        if(lhs.remote && rhs.remote)
            return false;
        assert(!lhs.remote && !rhs.remote);
    
        // Normale Frames weiter nach Nutzdaten sortieren
        // (Diese sind bei Remote-Frames nicht vorhanden!)
        return memcmp(lhs.data, rhs.data, 8) < 0;
    }
    

    Das Besondere daran ist, dass bei Remote-Frames der Ihnalt von data undefiniert ist - Damit zwei Remote-Frames gleich sind, reicht es aus, wenn deren IDs übereinstimmen. Bei "normalen" Frames müssen zusätzlich die Nutzdaten übereinstimmen. Remote-Frames und normale Frames können nie gleich sein.
    In der Praxis funktioniert das ganz gut, aber als ich (mal wieder) http://www.sgi.com/tech/stl/StrictWeakOrdering.html gelesen habe, bin ich ins Zweifeln gekommen, ob die Funktion wirklich so richtig ist. Daher brauche jetzt eine zweite Meinung 🙂



  • korrekt.



  • OK, Danke


Anmelden zum Antworten