C++11::lambda 的用法

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;});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值