如果比较函数不是运算符<! - ? - >,为什么std :: sort会崩溃

时间:2013-08-17 17:41:41

标签: c++ algorithm exception standards

以下程序是使用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 个答案:

答案 0 :(得分:25)

std::sort需要一台满足严格弱排序规则的分拣机, here

所以,你的比较器说a < ba == b没有遵循严格弱排序规则时,算法可能会崩溃,因为它会进入一个无限循环。

答案 1 :(得分:10)

xorguy的答案非常好。

我只想在标准中添加一些引用:

  

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

     

对于25.4.3中描述的算法以外的算法才能正常工作, comp必须在值上引入严格弱排序

     

术语 strict 指的是非自反关系的要求(!comp(x,x)适用于所有x),术语 weak 指的是非要求与总排序一样强,但强于部分排序的那些。

所以xorguy非常好地解释了这一点:comp函数说a < ba == b没有遵循严格弱排序规则时...

答案 2 :(得分:0)

代码的问题是您正在访问无效的内存。代码

coll[8]

尝试访问最后一个数组元素之后的元素(最后一个元素索引为7)。 我建议使用std :: array而不是普通的C数组。

std::array<A, 8> a;

// fill it somehow

std::sort(a.begin(), a.end());