lambda

lambda表达式

形:

[capture list] (parameter list)->return type{function body}

capture list (捕获列表):是一个lambda所在函数中定义的局部变量列表(通常为空,表示不使用所在函数的任何局部变量)

parameter list  return type f unction body与普通函数一样;

其中,必须包括捕获列表,函数体

auto f=[] {return 42;};
调用方式:调用运算符 cout<<f()<<endl;


传递参数:

注意:lambda不能有默认参数,即一个lambda调用的实参数目与形参数目相等

//按长度排序,长度相同的按字典序

stable_sort(words.begin(),word.end(),[](const string &a,const string  &b){return a.size()<b.size();});

捕获:

值捕获:使用前提变量可拷贝,在lambda创建时拷贝,不是调用时

void fcn1()
{
size_t v1=42;
auto f=[v1]{return v1;};
v1=0;
auto j=f();//j为42
}

引用捕获:

注意:确保被引用对象在lambda执行时存在;有时引用捕获时是必须的,捕获不能拷贝的对象,如ostream对象

void fcn2()
{
size_t v1=42;
auto f=[&v1]{return v1;};
v1=0;
auto j=f();//j为0
}


隐式捕获

&捕获引用方式   =值捕获方式

混合捕获方式:捕获列表的第一个元素必须为一个&或=,显式捕获的变量必须使用与隐式捕获不同的方式,即,隐引,则显值;

[&,c](const string &s){os<<s<<c;}     [=,&os](const string &s){os<<s<<c;}

lambda返回类型

默认情况下,如果一个lambda体包含return 之外的任何语句,则编译器假定lambda返回void

[](int i){return i<0?-i:i;}lambda体为单一return语句,返回无须指定返回类型,可推断
[](int i){if(i<0)return -i;else return i;}错误;不能判断lambda的返回类型
[](int i)->int{if(i<0)return -i;else return i;}指定返回类型


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值