为了账号安全,请及时绑定邮箱和手机立即绑定

如果比较功能不像运算符<那样,为什么std :: sort会崩溃?

如果比较功能不像运算符<那样,为什么std :: sort会崩溃?

鸿蒙传说 2019-12-05 16:05:37
以下程序是使用VC ++ 2012编译的。#include <algorithm>struct A{    A()        : a()    {}    bool operator <(const A& other) const    {        return a <= other.a;    }    int a;};int main(){    A coll[8];    std::sort(&coll[0], &coll[8]); // Crash!!!}如果我更改return a <= other.a;为,return a < other.a;则程序将正常运行,没有例外。为什么?
查看完整描述

3 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

std::sort需要其满足分拣机严格弱排序规则,这是解释 在这里


因此,您的比较器说,a < b当a == b不遵循严格的弱排序规则时,该算法可能会崩溃,因为它将进入无限循环。


查看完整回答
反对 回复 2019-12-05
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

xorguy的答案非常好。


我只是从标准中添加一些报价:


25.4排序及相关操作[alg.sorting]


为了使25.4.3中描述的算法无法正常工作,comp必须在值上引入严格的弱排序。


术语“ 严格”是指对非自反关系的要求(!comp(x,x)对于所有x),而术语“ 弱于”的要求不如总订购的要求强,但要强于部分订购的要求。 。


所以xorguy很好地解释了这一点:您的comp函数说,a < b当a == b哪个不遵循严格的弱排序规则时...


查看完整回答
反对 回复 2019-12-05
?
开满天机

TA贡献1786条经验 获得超12个赞

您必须详细了解它要检查的内容,但是标准的排序例程旨在非常非常快地运行,因此它们不必检查您所做的任何事情就可以了,而只是依靠它。如果您的比较返回不可能的结果,那么将不可能发生的事情-说它得到了一些比较的结果,并将其用作查看位置的索引,只有它“知道”可能的值并“知道”结果引用将存储在有效存储中,因此只需将其提取即可。Kaboom:SIGSEGV运气不错。如果运气不好,它将无声地管理您的数据

查看完整回答
反对 回复 2019-12-05
  • 3 回答
  • 0 关注
  • 685 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信