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

标签 c++ sorting set std icomparable

我写了下面的仿函数,希望集合中的所有元素都按照插入的相反顺序添加:

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 :

  1. a < afalse (反身性)
  2. a < b正在true暗示 b < afalse (不对称)
  3. a < bb < 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/

相关文章:

sorting - 在 Notepad++ 中的某个字符后对行进行排序

javascript - 为 IE11 中的 JavaScript 问题创建稳定的排序

python - 在 Python 中从 .csv 文件排序

python - 集合运算的奇怪表现

c++ - 将 shared_ptr 与在堆栈上创建的对象进行比较

c++ - 文件创建/删除效率?

c++ - float4 - 乘加 - 性能技巧 OpenCL

c++ - 在 qt 中使用另一个类对象作为信号和槽

java - 从输入创建集合

java - 具有自定义类型的 HashSet