繁体   English   中英

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

[英]What's the logic behind the order the elements are passed to a comparison function in std::sort?

我正在练习lambdas:

 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参数的顺序背后的逻辑是什么?

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

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

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

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

对于Visual Studio,如果子数组大小为<= 32个元素,则std :: sort使用插入排序。 对于更大的子数组,它使用intro排序,除非“递归”深度太深,否则它会快速排序,在这种情况下,它会切换到堆排序。 您编程的输出似乎对应于插入排序的某些变化。 由于比较函数是“小于”,并且由于左值“大于”右值,因此插入排序正在查找乱序,因此交换输入参数。

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

因此,对于您的谓词:

return a > b;

如果a 大于 b ,那么a b 之前


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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM