18

以下程序使用 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;则程序按预期运行,无一例外。

为什么?


std::sort需要一个满足严格的弱排序规则的排序器, 这里解释

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

4

3 回答 3

29

std::sort需要一个满足严格的弱排序规则的排序器, 这里解释

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

于 2013-08-17T17:53:55.600 回答
10

xorguy 的答案非常好。

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

25.4 排序及相关操作【alg.sorting】

为了使 25.4.3 中描述的算法以外的算法正常工作,comp 必须对值进行严格的弱排序

术语strict指的是对所有 x 的非自反关系(!comp(x, x))的要求,而术语weak指的是不如全序的要求强,但比偏序强的要求.

所以 xorguy 很好地解释了它:你的comp函数说a < ba == b它不遵循严格的弱排序规则时......

于 2013-08-17T18:29:32.350 回答
0

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

coll[8]

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

std::array<A, 8> a;

// fill it somehow

std::sort(a.begin(), a.end());
于 2020-02-21T06:38:30.233 回答