作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我写了下面的仿函数,希望集合中的所有元素都按照插入的相反顺序添加:
struct cmp {
bool operator () (int a, int b) {
return false;
}
};
当我如下测试时,添加到集合中的唯一值是 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;
}
但是,当我将仿函数更改为每次都返回 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
)不是严格的弱顺序,因为它违反了第一个条件(非自反性)。集合中发生的任何事情都是未定义的行为。
关于C++:为什么返回 false 的集合顺序的仿函数只允许将一个元素添加到集合中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33847601/
我是一名优秀的程序员,十分优秀!