【问题标题】:What's the logic behind the order the elements are passed to a comparison function in std::sort?将元素传递给 std::sort 中的比较函数的顺序背后的逻辑是什么?
【发布时间】:2019-05-30 11:18:58
【问题描述】:

我正在练习 lambda:

 int main()
 {
    std::vector<int> v {1,2,3,4};
    int count = 0;
    sort(v.begin(), v.end(), [](const int& a, const int& b) -> bool
        {
        return a > b;
        });
  }

这只是来自 GeeksForGeeks 的代码,用于按降序排序,没什么特别的。我添加了一些打印语句(但在这篇文章中将它们取出)以查看 lambda 内部发生了什么。他们打印整个向量,以及 ab 值:

1 2 3 4  
a=2 b=1

2 1 3 4  
a=3 b=2

3 2 1 4  
a=4 b=3

4 3 2 1 <- final

所以我更详细的问题是: 将向量元素传递到ab 参数的顺序背后的逻辑是什么?

b 是否永久位于索引 0a 正在迭代?如果是这样,传递给 lambda 的 second 参数停留在 first 元素是不是有点奇怪?它是特定于编译器的吗?谢谢!

【问题讨论】:

  • 顺序取决于 std 库使用的排序算法。因此,如果您不知道使用哪种算法,您永远无法知道它们被调用的顺序。
  • 为什么要使用const int&amp; 参数?
  • geeksforgeeks 上就是这样。我猜他们只是为了整洁或其他什么。在实际情况下,lambda 可能会改变 'a' 或 'b' 所以 const 不在。虽然不确定参考。 @curiousguy

标签: c++ sorting stl std strict-weak-ordering


【解决方案1】:

通过将谓词传递给std::sort(),您指定了您的排序标准。对于您指定的排序标准,如果第一个参数(即a第二个参数(即b)之前,谓词必须返回true

因此,对于您的谓词:

return a > b;

如果a大于b,那么a先于b


所以我更详细的问题是:向量元素传递到ab 参数的顺序背后的逻辑是什么?

ab 只是您传递给std::sort() 的元素的元素对。 “逻辑”将取决于std::sort() 实现的底层算法。由于随机化,对于具有相同输入的调用,这些对也可能不同。

【讨论】:

    【解决方案2】:

    在“a”迭代时,“b”是否永久位于索引 0?如果是这样,传递给 lambda 的第二个参数停留在第一个元素是不是有点奇怪?

    不,因为第一个元素更高。

    似乎,使用这种算法,所有元素都被检查(并且可能切换)较高的元素(在第一轮),并且较高的元素被放置在第一个位置;所以b 永远指向更高的那个。

    【讨论】:

    • 感谢您的回复!那么我的问题变成了如果'a'和'b'被分配(由std :: sort)基于哪个更大,为什么有比较返回语句?
    • @RyanA - 关键是b 固定为较大的(目前找到),a 是可能的替代方案(第一次指向v[1],第二次指向@ 987654325@,第三次联系v[3]);返回的值很重要,因为如果true,列表将重新排序。
    • 这是一个很好的说明!谢谢你的回答:)
    【解决方案3】:

    对于 Visual Studio,如果子数组大小为

    【讨论】:

      【解决方案4】:

      您只需比较具有给定顺序的两个元素。这意味着如果顺序是a,然后是b,那么lambda 必须返回true

      ab 是数组的第一个或最后一个元素,或者是固定的,这取决于排序算法,当然也取决于您的数据!

      【讨论】:

      • 感谢您的回复!你是说 lambda 变量 'a' 和 'b' 是根据哪个更大的向量元素分配的(在这个中总是'a')?因此,这个 lambda 将始终返回 true,因为 'a' 将始终大于 'b'?
      • 不,我是说 lambda 在数据中创建了一个排序。它作为一个值分配的内容取决于您的数据和排序算法。
      猜你喜欢
      • 2015-07-31
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多