在C ++中使用Lambda函数进行排序

Car*_*rre 2 c++ sorting

我不明白以下简单的排序代码有什么问题。它可以编译,但是在我尝试运行它时会产生分段错误。

我知道还有其他方法可以进行相同的排序,并且我使用的值都是相同的(因此,没有任何排序的方法),但是我想了解为什么它会产生细分错误。

如果我使用w[1][i]>w[1][j]而不是w[1][i]>=w[1][j]在比较器中没有问题。

vector<int> a(100);
iota(a.begin(),a.end(),0);
vector<vector<int> >  w(2,vector<int>(100,1));
sort(a.begin(),a.end(),[&w](const int i,const int j){return w[0][i]>w[0][j] || (w[0][i]==w[0][j] && w[1][i]>=w[1][j]);});
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 5

您的lambda没有提供严格的弱订购,这违反了合同std::sort。这意味着代码具有未定义的行为,并且可能出现分段错误。凭借严格的弱序,如果a < btrueb < a必须false。这不是在这里发生。不管是什么ij

w[0][i]>w[0][j] || (w[0][i]==w[0][j] && w[1][i]>=w[1][j])
Run Code Online (Sandbox Code Playgroud)

变成

1 > 1 || (1 == 1 && 1 >= 1)
Run Code Online (Sandbox Code Playgroud)

这是

false || (true && true)
Run Code Online (Sandbox Code Playgroud)

只是true。如果ijab)被交换,您仍然会得到相同的结果。当您使用>,而不是>=1 > 1false导致拉姆达返回false,并sort说,所有的项目都是平等的。