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

xml*_*lmx 16 c++ algorithm standards exception

以下程序是使用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!!!
}
Run Code Online (Sandbox Code Playgroud)

如果我return a <= other.a;改为return a < other.a;那么程序按预期运行,没有例外.

为什么?

xor*_*guy 26

std::sort需要一台满足严格弱排序规则的分拣机,这里将对此进行解释

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

  • +1这很好地说明了`std :: sort`比较器的要求.我会使用`std :: sort(std :: begin(coll),std :: end(coll));`如果你的编译器符合C++ 11(并且OP**是*兼容的; VS2012) ).如果您更改了阵列的尺寸,或者使用任何标准容器,那么您会很高兴. (4认同)
  • @btilly我认为因为`std::sort`使用递归算法,在无限循环的情况下会导致堆栈溢出。 (3认同)

Pie*_*aud 10

xorguy的答案非常好.

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

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

对于25.4.3中描述的算法之外的算法无法正常工作,comp必须对值进行严格的弱排序.

术语" 严格"是指对所有x的反自由关系的要求(!comp(x,x)),对于要求的要求不弱于总排序的要求,但强于部分排序的要求.

所以xorguy解释得非常好:你的comp功能说a < ba == b不遵循严格的弱排序规则时......