我刚刚看了STL的STLs的this lecture。传递给多参数lambda表达式的参数
的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是一个一元函数,那么它的输入参数就是迭代器当前指向的任何东西。它是否正确?
但使用二元函数,输入参数困惑我。
我错过了什么,或者你在问为什么比较函数比较*两个*东西需要*两个*参数?在排序算法运行时,它经常比较项目以确定它们的“顺序”是否正确,强调单词“项目”中的** s **。 – WhozCraig
我明白,比较函数需要两件事。我的问题是'哪些'有两件事正在传递给比较器,如果可能的话,'如何'。换句话说,作为程序员,我可以期望得到什么作为输入参数,以便我可以决定在lambda内执行什么检查。 – Gautam
@Gautam啊。你可以期待你的序列中的任何东西。何时和如何 - 经常出现的东西完全取决于正在使用的算法。并且我建议您在编写自己的文章之前彻底理解严格 - 弱 - 排序的概念,尤其是在编写基于复杂对象中多个字段值的订单时。 – WhozCraig