我们可以将<(less)运算符的函数传递给STL数据结构,例如setmultisetmappriority_queue,...

如果我们的函数像<=(less_equal)一样会出现问题吗?

最佳答案

从有效STL->项目21。始终具有比较功能,对于相等,返回false
值(value)观。

创建一个以less_equal为比较类型的集合,然后将10插入到该集合中:

set<int, less_equal<int> > s; // s is sorted by "<="
s.insert(10); //insert the value 10

现在尝试再次插入10:
s.insert(10);

对于此插入调用,集合必须确定是否已经存在10个。我们知道
这是。但套装像 toast 一样笨,所以必须检查一下。为了更容易
了解集合在执行此操作时会发生什么,我们将其称为最初的10
插入了10A,然后尝试插入10B。该集合遍历其内部数据结构,寻找要插入10B的位置。最终,它必须检查10B以查看是否与10A相同。 “相同”的定义
因为关联容器是等价的,所以set测试看是否
10B等效于10A。进行此测试时,它自然会使用套件的
比较功能。在此示例中,该操作符为less_equal作为集合的比较函数,less_equal表示运算符。套装
因此检查此表达式是否为真:
!(10A<= 10B)&&!(10B<= 10A) //test 10Aand 10B for equivalence

好吧,10A和10B都是10,所以10A
!!(true)&&!(true)

并简化为
false && false

这是完全错误的。也就是说,该集合得出的结论是10A和10B不相等,
因此不一样,因此将10B插入容器旁边
10A。从技术上讲,此 Action 会产生不确定的行为,但几乎是普遍的
结果是该集合以值10的两个拷贝结束,这意味着它不是
一套了。通过使用less_equal作为比较类型,我们破坏了
容器!此外,相等值返回true的任何比较函数都将
做同样的事。根据定义,相等的值不是等效的!

09-06 11:43