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
)不是严格的弱序,因为它违反了第一个条件(不可伸缩性)。集合中发生的任何事情都是未定义的行为