我不明白以下简单的排序代码有什么问题。它可以编译,但是在我尝试运行它时会产生分段错误。
我知道还有其他方法可以进行相同的排序,并且我使用的值都是相同的(因此,没有任何排序的方法),但是我想了解为什么它会产生细分错误。
如果我使用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)
您的lambda没有提供严格的弱订购,这违反了合同std::sort。这意味着代码具有未定义的行为,并且可能出现分段错误。凭借严格的弱序,如果a < b是true则b < a必须false。这不是在这里发生。不管是什么i和j有
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。如果i和j(a和b)被交换,您仍然会得到相同的结果。当您使用>,而不是>=再1 > 1是false导致拉姆达返回false,并sort说,所有的项目都是平等的。