首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在c++中使用lambda函数进行排序

在c++中使用lambda函数进行排序
EN

Stack Overflow用户
提问于 2019-06-13 03:36:20
回答 1查看 164关注 0票数 2

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

我知道还有其他方法可以进行相同类型的排序,并且我使用的值都是相同的(所以,没有什么可以排序的),但我想知道为什么它会产生分段错误。

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

代码语言:javascript
复制
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]);});
EN

回答 1

Stack Overflow用户

发布于 2019-06-13 03:50:26

您的lambda没有提供严格的弱排序,这违反了std::sort的约定。这意味着代码具有未定义的行为,分段错误可能是这种情况的结果。对于严格的弱排序,如果a < btrue,则b < a必须为false。这在这里不会发生。无论ij是什么

代码语言:javascript
复制
w[0][i]>w[0][j] || (w[0][i]==w[0][j] && w[1][i]>=w[1][j])

变成了

代码语言:javascript
复制
1 > 1 || (1 == 1 && 1 >= 1)

这就是

代码语言:javascript
复制
false || (true && true)

即使交换了ij (ab),您仍然会得到相同的结果。当您使用>而不是>=时,1 > 1false,导致lambda返回falsesort表示所有项都是相等的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56569247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档