以下程序是使用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
需要满足严格弱排序规则的分类器,对此进行了说明here
所以,您的比较器说a < b
,当a == b
不遵循严格弱排序规则时,该算法可能会崩溃,因为它将进入无限循环。
xorguy的答案非常好。
我只想在标准中添加一些引号:
25.4排序和相关操作[alg.sorting]
为了使25.4.3中所述的算法无法正常工作,comp必须在值上产生严格弱排序。
术语strict是指不自反关系的要求(对于所有x都是!comp(x,x)),术语weak指的是不如总要求强的要求排序,但比部分排序要强。
所以xorguy解释得很好:当comp
不遵循严格弱排序规则时,a < b
函数表示a == b
...
您的代码存在的问题是您正在访问无效的内存。代码
coll[8]
试图访问最后一个数组元素之后的元素(最后一个元素索引为7)。我建议使用std :: array而不是普通的C数组。
std::array<A, 8> a;
// fill it somehow
std::sort(a.begin(), a.end());