![](/img/trans.png)
[英]What is the logic behind binary comparison between elements and number of elements in finding a subset?
[英]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里面发生了什么。 它们打印整个矢量,以及a
和b
值:
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
所以我更详细的问题是:向量元素被传递到a
和b
参数的顺序背后的逻辑是什么?
当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
之前 。
所以我更详细的问题是:向量元素被传递到
a
和b
参数的顺序背后的逻辑是什么?
a
和b
只是传递给std::sort()
的元素的元素std::sort()
。 “逻辑”将取决于std::sort()
实现的基础算法。 由于随机化,对于具有相同输入的呼叫,对也可以不同。
您只需使用给定的顺序比较两个元素。 这意味着如果订单是a
然后是b
,那么lambda必须返回true
。
a
或b
是数组的第一个或最后一个元素,或者是固定的,这取决于排序算法,当然还有数据!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.