将元素传递到std :: sort中的比较函数的顺序背后的逻辑是什么?

时间:2019-01-03 20:46:22

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

我正在练习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迭代时0是否永久位于索引a?如果是这样,传递给lambda的 second 参数停留在 first 元素是否有点奇怪?它是特定于编译器的吗?谢谢!

4 个答案:

答案 0 :(得分:1)

  

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

否,因为第一个元素较高。

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

答案 1 :(得分:1)

对于Visual Studio,如果子数组大小小于等于32,则std :: sort使用插入排序。对于较大的子数组,它使用介绍性排序,这是快速排序,除非“递归”深度过深,在这种情况下,它将切换为堆排序。您的程序产生的输出似乎对应于插入排序的某些变体。由于比较函数“小于”,并且由于左值“大于”右值而导致插入排序正在乱序查找,因此将交换输入参数。

答案 2 :(得分:1)

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

因此,对于您的谓词:

return a > b;

如果ab大,则a将先于{em> b


  

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

ab只是要传递给std::sort()的元素对中的一对。 “逻辑”将取决于std::sort()实现的基础算法。对于输入相同的呼叫,由于随机性,配对也可能有所不同。

答案 3 :(得分:0)

您只需要比较两个元素的给定顺序即可。这意味着,如果顺序为scala> sql("select element_at(a, 2).value from customDimensions").show +----------------------+ |element_at(a, 2).value| +----------------------+ | one| +----------------------+ ,然后为a,则lambda必须返回b

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