C++:为什么返回false的set order的仿函数只允许将一个元素添加到集合中?

mil*_*lim 2 c++ sorting icomparable std set

我编写了以下仿函数,期望集合中的所有元素将按插入的相反顺序添加:

struct cmp {
  bool operator () (int a, int b) {
    return false;
  }
};  
Run Code Online (Sandbox Code Playgroud)

当我按下面的方式测试时,添加到集合中的唯一值是1.

int main() {
  set<int, cmp > combos;

  combos.insert(1);
  combos.insert(4);
  combos.insert(7);
  combos.insert(5);
  combos.insert(9);
  combos.insert(1);

  for (int a : combos) {
    cout << a << endl;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我每次将仿函数更改为true时,所有值都按插入顺序添加到集合中[1, 4, 7, 5, 9, 1].我认为当仿函数比较器返回时true,它被视为第一个元素小于第二个元素,false表示第一个元素被视为比第二个元素更大?当我这样做return (a < b);并且 return (a > b);在操作员功能中时似乎就是这种情况.

Die*_*ühl 7

比较函数需要在元素上定义严格的弱顺序.也就是说,这三个条件必须适用于所有的元素,a,b,c:

  1. a < afalse(无反射)
  2. a < b存在true意味着b < afalse(不对称)
  3. a < bb < c这两种true暗示a < ctrue(传递)

使用比较器对象时,cmp上述条件需要应用x < y替换为cmp(x, y).

你的第一个比较函数(总是返回false)实际上是一个严格的弱序,但是,暗示所有元素都是等价的.没有办法区分两个元素.特别是既不收益a < b也不b < a收益true.如果这两个条件都是false明显的两个对象是等价的.结果,集合中只有一个元素.

第二个比较函数(总是返回true)不是严格的弱顺序,因为它违反了第一个条件(irreflexitity).无论集合中发生什么,都是未定义的行为.