传递给多个参数 lambda 表达式的参数
Parameters passed to multiple argument lambda expression
我刚刚看了STL关于STL的讲座。
在讲座开始大约 57 分钟后,我们有以下代码:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
int main()
{
std::vector<std::string> v;
v.push_back("cat");
v.push_back("antelope");
v.push_back("puppy");
v.push_back("bear");
std::sort(v.begin(), v.end(),
[](const std::string& left, const std::string& right)
{
return left.size() < right.size();
}
);
for (std::vector<std::string>::iterator i = v.begin(); i != v.end(); ++i)
{
std::cout << *i << " ";
}
std::cout << std::endl;
return 0;
}
正如预期的那样,这将以长度的递增顺序打印矢量中的字符串。我的问题是关于 lambda 表达式的,它是 sort
函数的第三个参数。在内部,什么被传递给输入参数"左"和"右"?
我添加了这一行:
std::cout << "left: " << left << ", right: " << right << std::endl;
在 lambda 的主体内部,我得到的输出是:
左:羚羊,右:猫
左:羚羊,右:猫
左:小狗,右:猫
左:小狗,右:羚羊
左:小狗,右:猫
左:熊,右:猫
左:熊,右:羚羊
左:熊,右:小狗
左:熊,右:猫
猫熊小狗羚羊
因此,看起来"左"和"右"参数与内部排序算法有某种关系。谁能更清楚地了解到底发生了什么?
我的理解是,如果lambda是一个一元函数,那么它的输入参数将是迭代器当前指向的任何参数。这是对的吗?
但是对于二进制函数,输入参数让我感到困惑。
大多数排序算法的核心是两个元素之间的比较,以确定哪个元素应该在另一个元素之前。 例如,这里是快速排序,取自维基百科。
function quicksort(array)
if length(array) ≤ 1
return array // an array of zero or one elements is already sorted
select and remove a pivot element pivot from 'array' // see '#Choice of pivot' below
create empty lists less and greater
for each x in array
*****if x ≤ pivot then append x to less***** this line here
else append x to greater
return concatenate(quicksort(less), list(pivot), quicksort(greater)) // two recursive calls
在这个伪代码的情况下,比较是这样的
if x ≤ pivot
请注意,这是一个二进制操作,两个参数x
和 pivot
。 在标准库函数std::sort
的情况下,这将是:
if (comp(x,pivot))
其中comp
是作为最后一个参数传入的函子。 因此,要回答您的问题:"哪 2 件事开始传递到比较器中",需要在算法逻辑中的特定时间比较范围的任何 2 个元素。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何将lambda作为模板类的成员函数参数
- 使用自动推导的 lambda 参数作为常量表达式
- 如果模板没有可变参数,则 Lambda 被推导出为 std::function
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 将__device__ lambda 作为参数传递给 __global__ 函数
- 将 lambda 函数作为参数传递C++
- 如何将 lambda 函数作为参数发送到另一个函数
- Lambda可以用作非类型模板参数吗
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 如何确定捕获不可复制参数的 lambda 的类型?
- 省略C++可变参数 lambda 中的"auto"关键字?
- 如何访问可变参数 lambda 函数参数
- 可变参数 lambda 捕获的解决方法
- 传递给多个参数 lambda 表达式的参数
- 如何编写丢弃其参数的通用可变参数 lambda
- 使用c++参数lambda函数
- 将函数模板"pass"为泛型可变参数 lambda 返回语句是好方法吗?
- c++模板非类型参数lambda函数