C++ sort函数的使用注意事项及潜在bug

前言
永远让比较函数对相等的值返回false

sort函数的cmp必须按照规定来写,即必须只是 > 或者 <

比如: return a > b; return a < b;

而不能是 <= 或者 >= ,(实际上等于号加了也是毫无意义,sort是不稳定的排序),否则可能会出现段错误

严格弱序的定义:如果两个元素具备任何一个元素都不小于另一个元素的性质,那么就视为它们是具备某种程度之等价关系是合理的。公式:!(x<y) && !(y<x) , 广义上 !op(x,y) && !op(y,x) (op(x,y) 表示比较x和y)

为什么要严格弱序?

对于sort中排序函数,如果不遵守严格弱序,那么在根据pivot调整元素顺序时,
while (__comp(*__first, __pivot)) ++__first; 中++__first会越界。导致程序崩溃。
 while (true)
    {
        while (__comp(*__first, __pivot))
            ++__first;
        --__last;
        while (__comp(__pivot, *__last))
            --__last;
        if (!(__first < __last))
            return __first;
        std::iter_swap(__first, __last);
        ++__first;
    }
对于有序且无重复元素的关联容器(例如,set,map),向里面插入两个相同元素时,
如果定义的比较函数不是严格弱序的话(而是 在<= 情况下,返回true),
由于stl判断相等是使用的 !Cmp(a,b) && !Cmp(b,a),那么当a 和b 相等时,
stl判断相等会返回false,被认为这两个元素值不同的,这是错误的。
所以比较函数需要遵守严格弱序原则,换句话说,永远让比较函数对相等的值返回false

错误使用示例
在这里插入图片描述
在这里插入图片描述

参考资料:
https://blog.csdn.net/bichenggui/article/details/4705472
https://segmentfault.com/a/1190000018461090
《Effective STL》 条款21: 永远让比较函数对相等的值返回false
《c++标准程序库》 P176
《泛型编程与STL》第六章
https://blog.csdn.net/llz62378/article/details/88937139

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值