以下程序是使用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;
,那么程序会按预期运行,没有例外。
为什么?
答案 0 :(得分:25)
std::sort
需要一台满足严格弱排序规则的分拣机,
here
所以,你的比较器说a < b
当a == b
没有遵循严格弱排序规则时,算法可能会崩溃,因为它会进入一个无限循环。
答案 1 :(得分:10)
xorguy的答案非常好。
我只想在标准中添加一些引用:
25.4排序和相关操作[alg.sorting]
对于25.4.3中描述的算法以外的算法才能正常工作, comp必须在值上引入严格弱排序。
术语 strict 指的是非自反关系的要求(!comp(x,x)适用于所有x),术语 weak 指的是非要求与总排序一样强,但强于部分排序的那些。
所以xorguy非常好地解释了这一点:comp
函数说a < b
当a == b
没有遵循严格弱排序规则时...
答案 2 :(得分:0)
代码的问题是您正在访问无效的内存。代码
coll[8]
尝试访问最后一个数组元素之后的元素(最后一个元素索引为7)。 我建议使用std :: array而不是普通的C数组。
std::array<A, 8> a;
// fill it somehow
std::sort(a.begin(), a.end());