c++ - C++ 中使用 lambda 函数进行排序

标签 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]);});

最佳答案

您的 lambda 不提供严格的弱排序,违反了契约(Contract) std::sort有。这意味着代码具有未定义的行为,并且段错误可能是其结果。严格弱排序 if a < btrue然后b < a必须是false 。这里不会发生这种情况。无论如何ij

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 。如果ij ( ab )交换,你仍然得到相同的结果。当您使用>时而不是>=然后1 > 1false导致 lambda 返回 falsesort表示所有项目都是平等的。

关于c++ - C++ 中使用 lambda 函数进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56569247/

相关文章:

python - 未调用 PyBind11 析构函数?

c++ - 如何在 cmake 中使用 FFTW 库?

MYSQL 对组中的项目进行排序,然后对组进行排序

R: Sum Complete.cases in a column 按另一列中的值分组(或排序)

python - 循环将列表拆分为不同的子列表

ios - 如何在只有全名的情况下使用姓氏对核心数据进行排序?

c - 对部分排序的数组进行排序

C++ 在到达输入末尾后结束 do while 循环

c++ - 3D vector C++ 的循环帮助

c++ - 在具有公共(public)基础的 2 个模板类之间安全地转换