1.什么是lambda
C++ 98/03标准并不原生支持匿名函数,如果你想实现类似的功能的话,可以利用Boost.Lambda来实现一个匿名函数。但是从C++11以来,C++提供了我们一个强有力的工具,允许我们编写一个匿名的函数,它可以方便你写一些短小的代码,这些代码不会被重用,也不值得命名。 表达式最简单的定义如下:
[ capture clause ] (parameters) -> return-type
{
definition of method
}
2.怎么使用lambda
在C++11之前,我们想要用到STL的一些算法来操作我们的容器,比如我们想在一个vector里找到大于10小于20的数,把他们打印出来,那我们需要这样做:
1.先定义一个仿函数,类似下面这样:
struct Func
{
void operator()(int n)
{
if (n > 10 && n < 20)
{
std::cout << n << "\n";
}
}
};
2.然后把它传递给算法:
vector<int> v{0,15,23,12,14,10,20,33};
std::for_each(v.begin(), v.end(), Func());
/*
会打印出:
15
12
14
*/
这样的做法很麻烦,因为我们每次使用一个需要仿函数作为一个实参的算法的时候,都需要另外写一个仿函数。
现在,有了lambda,你可以简单的写成这样:
std::for_each(v.begin(), v.end(), [](int n)
{
if (n > 10 && n < 20)
{
std::cout << n << std::endl;
}
});
3.发生了什么
lambda表达式其实就是一个类。为了调用它,编译器需要实例化类的一个对象。从lambda表达式实例化的对象,我们称之为lambda闭包。
当你写下一个lambda表达式时,比如:
auto i_am_lambda = [](int x, int y)->bool { return x > y; };
编译器会在内部为生成下面的类:
class __lambda_1
{
public:
bool operator()(int x, int y) const
{
return x > y;
}
};
明白这一点至关重要。