为什么operator <of c ++ map不能与<=一起使用

sah*_*aha 1 c++ stl

我有以下程序用于自定义键的地图:

class MyClass
{
public:

    MyClass(int i): val(i) {}

    bool operator< (const MyClass& that) const { return val <= that.val; }

private:
    int val;
};

int main()
{
    MyClass c1(1);
    MyClass c2(2);
    MyClass c3(3);

    map<MyClass, int> table;

    table[c1] = 12;
    table[c2] = 22;
    table[c3] = 33;

    cout << "Mapped values are: " << table.lower_bound(c1)->second << " " << table[c2] << " " << table[c3] << endl;

}
Run Code Online (Sandbox Code Playgroud)

输出如下:

Mapped values are: 22 0 0
Run Code Online (Sandbox Code Playgroud)

但是,如果我在运算符<而不是<=中使用<或>进行比较,那么一切正常.输出如下:

Mapped values are: 12 22 33
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么<=根本不起作用,但<甚至>有效吗?

Mil*_*nek 7

使用的比较函数std::map必须实现严格的弱排序.这意味着它必须实现给定对象下面的规则x,y以及z:

  • op(x, x) 必须永远是假的
  • 如果op(x, y)是真的那么op(y, x)必须是假的
  • 如果op(x, y) && op(y, z)是真的那么op(x, z)也必须是真的
  • 如果!op(x, y) && !op(y, x)是真的那么!op(x, z) && !op(z, x)也必须是真的

<=运营商不满足这些条件,因为鉴于x = y = 1,x <= x是不是假的,并都x <= yy <= x是真实的.

std::map使用这些规则来实现其比较.例如,它可以实现等式检查!(op(x, y) || op(y, x)).鉴于x = 4,y = 4op = operator<=这成为!(4 <= 4 || 4 <= 4),所以4不比较等于4,因为第一条规则之上被打破.