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);在操作员功能中时似乎就是这种情况.
比较函数需要在元素上定义严格的弱顺序.也就是说,这三个条件必须适用于所有的元素,a,b,c:
a < a是false(无反射)a < b存在true意味着b < a是false(不对称)a < b而b < c这两种true暗示a < c也true(传递)使用比较器对象时,cmp上述条件需要应用x < y替换为cmp(x, y).
你的第一个比较函数(总是返回false)实际上是一个严格的弱序,但是,暗示所有元素都是等价的.没有办法区分两个元素.特别是既不收益a < b也不b < a收益true.如果这两个条件都是false明显的两个对象是等价的.结果,集合中只有一个元素.
第二个比较函数(总是返回true)不是严格的弱顺序,因为它违反了第一个条件(irreflexitity).无论集合中发生什么,都是未定义的行为.