我不明白下面这个简单的排序代码有什么问题。它可以编译,但当我尝试运行它时,它会产生一个分段错误。
我知道还有其他方法可以进行相同类型的排序,并且我使用的值都是相同的(所以,没有什么可以排序的),但我想知道为什么它会产生分段错误。
如果我在比较器中使用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]);});
发布于 2019-06-13 03:50:26
您的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])
变成了
1 > 1 || (1 == 1 && 1 >= 1)
这就是
false || (true && true)
即使交换了i
和j
(a
和b
),您仍然会得到相同的结果。当您使用>
而不是>=
时,1 > 1
为false
,导致lambda返回false
,sort
表示所有项都是相等的。
https://stackoverflow.com/questions/56569247
复制相似问题