C++ C++;:为什么返回false的集合顺序函子只允许向集合中添加一个元素?

C++ C++;:为什么返回false的集合顺序函子只允许向集合中添加一个元素?,c++,sorting,set,std,icomparable,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.in

我编写了以下函子,希望集合中的所有元素都按插入的相反顺序添加:

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;
}
intmain(){
设置组合;
组合。插入(1);
组合。插入(4);
组合。插入(7);
组合。插入(5);
组合。插入(9);
组合。插入(1);
for(int a:组合){

cout在这种情况下,
std::set
使用
!(a
来确定两个元素的相等性:
a
b


!(假)和&!(假)
每次检查重复项时都会产生
true
,因此不允许
std::set
包含多个元素。这是对
std::set
的错误处理比较函数需要在元素上定义严格的弱顺序。也就是说,这三个条件需要适用于所有元素nts,
a
b
c

  • a
    false
    (不可伸缩性)
  • a
    true
    意味着
    b
    false
    (不对称)
  • a
    b
    true
    意味着
    a
    也是
    true
    (及物性)
  • 使用比较器对象
    cmp
    时,上述条件需要应用
    x
    替换为
    cmp(x,y)

    您的第一个比较函数(始终返回
    false
    )实际上是一个严格的弱序,但是,这意味着所有元素都是等价的。没有办法区分两个元素。特别是,
    a
    b
    都不会产生
    true
    。如果这两个条件都是
    false
    的话,这两个对象显然是等价的。因此,只有ne元素在集合中

    第二个比较函数(总是返回
    true
    )不是严格的弱序,因为它违反了第一个条件(不可伸缩性)。集合中发生的任何事情都是未定义的行为