来看一个有趣的现象。创建一个set,用less_equal作为它的比较类型,然后把10插入到该集合中,再插入10:
// s用"<="来排序
set<int, less_equal<int>> s;
// 插入10
s.insert(10);
// 再插入10
s.insert(10);
less_equal意味着operator<=:
// 检查10A和10B的等价性
!(10A <= 10B) && !(10B <= 10A)
false && false,返回false。表示10A和10B是不等价的,所以比较类型如果采用less_equal,那么后果是set集合中有两个10。即采用less_equal的比较类型破坏了set容器!
你只要记住,比较函数的返回值表明的是按照该函数定义的排列顺序,一个值是否应该在另一个之前。相等的值从来不会有前后顺序关系,所以对于相等的值,比较函数应当始终返回false。
你可能在想,对于set和map确实是这样,因为set和map不能包含重复的值。但对于multiset和multimap呢?这些容器可以包含重复的值,它可以吧这两个值都保存起来,没问题,对吗?举例说明:
// s用"<="来排序
multiset<int, less_equal<int>> s;
s.insert(10);
s.insert(10);
我们期望对它做equal_range操作,我们将得到一对迭代器,它们定义了一个包含这两个值的区间。但实际情况是,equal_range并不是指定一个包含相等值的区间,而是指定一个包含等价值的区间。
所以,结论就是:除非你的比较函数对相等的值总是返回false,否则你会破坏所有的标准关联容器,不管它们是否允许存储重复的值。