[3 关联容器] 21. 总是让比较函数在等值情况下返回false

来看一个有趣的现象。创建一个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,否则你会破坏所有的标准关联容器,不管它们是否允许存储重复的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值