lambda 是个不具名的 function object(或称做 functor),lambda 改变了 C++ 标准库的用法。
Lambda 的语法
最小型的 lambda 函数没有参数,如下:
[]{ std::cout << "hello world!" << std::endl; }
以上为表达式(expression),可以直接调用:
[]{ std::cout << "hello world!" << std::endl; };
或者传递给对象:
auto l = []
{ std::cout << "hello world!" << std::endl; };
...
l();
如上所示,lambda 总是由一个所谓的 lambda introducer 引入:一组方括号([ ]
),可在其内指定 capture
,用来在 lambda 内部访问 “nonstatic 外部对象”,而静态的外部对象,是可以直接使用的,无需在[ ]
中声明。
在 lambda introducer []
和 lambda body { }
之间,可以指明参数或mutable关键字,或一份异常明细(exception specification)以及返回类型。所有这一切都可有可无,但如果其中一个出现了,参数所需的小括号就必须出现,
auto l = [](const std::string& s)
{
std::cout << s << std::endl;
};
l("hello Zhang!");
lambda 不可以是 template,必须指明所有类型。
lambda 也可以有自己的返回值,但不需指明返回类型,该类型会根据返回值自动推导出来。
[]{ return 42;}
如果你想指明返回类型:
[]()->double{return 42;}
Lambda 搭配 STL 算法和容器
// 容器内全部元素的3次方
std::transform(coll.begin(), coll.end(), // source
coll.begin(), // destination
[](double d){ return d*d*d;}); // lambda as function object
查找某集合内数值在 x 和 y 之间
(search criterion)的第一个元素;
std::deque<int> coll = {1, 3, 19, 5, 13, 7, 11, 2, 17};
int x = 5, y = 12;
auto pos = std::find_if(coll.begin(), coll.end(), [=](int i){ return i>5 && i<12;});