如何对vector <vector <int>&gt; </vector <int>进行排序

时间:2013-08-30 05:12:15

标签: c++ stl

我写了一个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);
}

2 个答案:

答案 0 :(得分:6)

它可能会崩溃,因为排序的比较函数必须遵循strict weak ordering。几乎所有帐户的比较都失败了:

  

对于所有x,不是x&lt; X

这显然会失败。

  

对于所有x,y,如果x&lt;那么y&lt; X

compare_4sum(x, y)truecompare_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 ]