Operator< and strict weak ordering

前端 未结 6 2024
醉酒成梦
醉酒成梦 2020-11-22 03:51

How to define operator< on n-tuple (for example on 3-tuple) so that it satisfy strict weak ordering concept ? I know that boost library has

6条回答
  •  南旧
    南旧 (楼主)
    2020-11-22 04:12

    strict weak ordering

    This is a mathematical term to define a relationship between two objects.
    Its definition is:

    Two objects x and y are equivalent if both f(x, y) and f(y, x) are false. Note that an object is always (by the irreflexivity invariant) equivalent to itself.

    In terms of C++ this means if you have two objects of a given type, you should return the following values when compared with the operator <.

    X    a;
    X    b;
    
    Condition:                  Test:     Result
    a is equivalent to b:       a < b     false
    a is equivalent to b        b < a     false
    
    a is less than b            a < b     true
    a is less than b            b < a     false
    
    b is less than a            a < b     false
    b is less than a            b < a     true
    

    How you define equivalent/less is totally dependent on the type of your object.

    Formal Definition:
    Strict Weak ordering

    Computer Science:
    Strict Weak Ordering

    How it relates to operators:
    Comparator


    As a side note we can implement strict weak ordering manually. But we can do it simply using the std::tuple which has implemented it for you. You simply need to create a tuple without copying the objects.

    struct S
    {
         ThingA   a;
         ThingB   b;
    };
    bool operator<(S const& lhs, S const& rhs)
    {
        return std::tie(lhs.a, lhs.b) < std::tie(rhs.a, rhs.b);
    }
    

    Note: This assumes that thingA and thingB already implement strict weak ordering themselves.

    We can also implement equality the same way:

    bool operator==(S const& lhs, S const& rhs)
    {
        return std::tie(lhs.a, lhs.b) == std::tie(rhs.a, rhs.b);
    }
    

    Note again: This assumes that thingA and thingB already implement equality.

提交回复
热议问题