我写了一个compare()函数来排序vector< vector < int > >
并且它崩溃了。
具体来说,如果我致电sort(u.begin(),u.end());
,则不会发生崩溃。但是,如果我致电sort(u.begin(),u.end(), compare);
它已崩溃,即使compare()
只返回true
而没有更多代码。我的代码出了什么问题?
bool compare_4sum(vector<int>& a, vector<int>& b){
return true;
}
void test(){
vector<int> x;
x.push_back(1);
x.push_back(2);
vector<int> x2;
x2.push_back(2);
x2.push_back(4);
vector<vector<int>> u;
u.push_back(x);
u.push_back(x2);
sort(u.begin(),u.end(), compare);
}
答案 0 :(得分:6)
它可能会崩溃,因为排序的比较函数必须遵循strict weak ordering。几乎所有帐户的比较都失败了:
对于所有x,不是x&lt; X
这显然会失败。
对于所有x,y,如果x&lt;那么y&lt; X
compare_4sum(x, y)
将true
,compare_4sum(y, x)
也将std::sort
,因此会打破这一点。
依此类推。在为const &
编写谓词时,你必须非常小心他们没有违反这个合同,否则你很可能会崩溃。
此外,任何比较函数都不应该修改它所操作的值,因此你应该总是经过&
,而不是{{1}}。
答案 1 :(得分:6)
您的比较功能必须提供strict-weak ordering。如果没有,那么您对sort的调用会显示未定义的行为。
25.4 / 3&amp; 4
3)对于所有采用Compare的算法,都有一个使用的版本 运营商LT;代替。也就是说,comp(* i,* j)!= false默认为* i&lt; *∫ !=假。对于除25.4.3中描述的算法之外的算法 正确地说,comp必须对值进行严格的弱排序。
4)严格一词指的是反自由的要求 关系(!comp(x,x)表示所有x),而术语弱于要求 这不像总排序那么强,但更强 比那些部分订购。如果我们将equiv(a,b)定义为 !comp(a,b)&amp;&amp; !comp(b,a),然后要求是comp和 等值都是传递关系:
— comp(a, b) && comp(b, c) implies comp(a, c) — equiv(a, b) && equiv(b, c) implies equiv(a, c) [ Note: Under these conditions, it can be shown that — equiv is an equivalence relation — comp induces a well-defined relation on the equivalence classes determined by equiv — The induced relation is a strict total ordering. —end note ]