我正在练习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内部发生了什么。它们打印整个矢量,以及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
参数中的顺序背后的逻辑是什么?
b
迭代时0
是否永久位于索引a
?如果是这样,传递给lambda的 second 参数停留在 first 元素是否有点奇怪?它是特定于编译器的吗?谢谢!
答案 0 :(得分:1)
“ a”正在迭代时,“ b”是否永久位于索引0?如果是这样,传递给lambda的第二个参数停留在第一个元素上是否有点奇怪?
否,因为第一个元素较高。
似乎使用这种算法,所有元素都被检查(并且可能被切换)到较高的元素(在第一轮),并且较高的元素被放置在第一位置;因此b
一直指向较高的那个。
答案 1 :(得分:1)
对于Visual Studio,如果子数组大小小于等于32,则std :: sort使用插入排序。对于较大的子数组,它使用介绍性排序,这是快速排序,除非“递归”深度过深,在这种情况下,它将切换为堆排序。您的程序产生的输出似乎对应于插入排序的某些变体。由于比较函数“小于”,并且由于左值“大于”右值而导致插入排序正在乱序查找,因此将交换输入参数。
答案 2 :(得分:1)
通过将谓词传递给std::sort()
,即可指定排序标准。对于您指定的排序条件,如果第一个参数(即true
)在第二个(即a
之前之前,谓词必须返回b
因此,对于您的谓词:
return a > b;
如果a
比b
大,则a
将先于{em> b
。
所以我更详细的问题是:将向量元素传递到
a
和b
参数中的顺序背后的逻辑是什么?
a
和b
只是要传递给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
。
true
或a
是数组的第一个或最后一个元素,或者是固定的,这取决于排序算法,当然也取决于数据!