我不明白下面的简单排序代码有什么问题。它可以编译,但当我尝试运行它时会产生段错误。
我知道还有其他方法可以进行相同类型的排序,并且我使用的值都是相同的(因此,没有什么可排序的),但我想了解为什么它会产生段错误.
我用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]);});
最佳答案
您的 lambda 不提供严格的弱排序,违反了契约(Contract) std::sort
有。这意味着代码具有未定义的行为,并且段错误可能是其结果。严格弱排序 if 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])
变成了
1 > 1 || (1 == 1 && 1 >= 1)
这是
false || (true && true)
这只是 true
。如果i
和j
( a
和 b
)交换,你仍然得到相同的结果。当您使用>
时而不是>=
然后1 > 1
是 false
导致 lambda 返回 false
和sort
表示所有项目都是平等的。
关于c++ - C++ 中使用 lambda 函数进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56569247/