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

问题描述 投票:16回答:3

以下程序是使用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;,则程序将正常运行,没有例外。

为什么?

c++ algorithm exception standards
3个回答
26
投票

std::sort需要满足严格弱排序规则的分类器,对此进行了说明here

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


10
投票

xorguy的答案非常好。

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

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

为了使25.4.3中所述的算法无法正常工作,comp必须在值上产生严格弱排序

术语strict是指不自反关系的要求(对于所有x都是!comp(x,x)),术语weak指的是不如总要求强的要求排序,但比部分排序要强。

所以xorguy解释得很好:当comp不遵循严格弱排序规则时,a < b函数表示a == b ...


0
投票

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

coll[8]

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

std::array<A, 8> a;

// fill it somehow

std::sort(a.begin(), a.end());
© www.soinside.com 2019 - 2024. All rights reserved.