c++中的lambda

lambda是一种匿名函数对象的简洁方式
可以将lambda表达式看作共有的operator()的匿名结构。
例如实现for_each()中的函数对象时
可以使用

template <typename elementType>
struct DisplayElement
{
	void operator()(const elementType& element) const
	{
		cout<<element<<" ";
	}
};

for_each(v1.begin()
		,v1.end()
		,DisplayElement<int>());

使用lambda可以简介的创建上面的函数对象

for_each(v1.begin()
		,v1.end()
		,[](int element){cout<<element<<" ";}) 

定义方式

必须以[]开头,后面加的是参数列表,然后花括号里面放的是函数语句;

[](Type paramName){ // 函数语句}

捕获列表

lambda前面的[]中可以传递参数,其被称为lambda表达式的捕获列表

//寻找容器中能被指定值整除的数
auto iEvenNum = find_if(v1.end()
						,v1.end()
						,[Divisor](const int& Num){return (Num % Divisor==0));

函数中的局部变量,lambda时不允许访问的。如果真的要使用其局部变量要按值的形式将变量传入到lambda函数中

常用定义方式

[stateVar1,stateVar2](Type& param){函数语句}

//如果想改变出入捕获列表中的值就要按照引用的方式将其传入列表
[&stateVar1,&stateVar2](Type& param){函数语句}

//或者如果仅仅想只想lambda中对其进行修改,要加上multable,仅仅是在lambda中有效
[stateVar1,stateVar2](Type& param)multable{函数语句}

[=](Type& param){函数语句}//lambda范围外的所有数据拷贝传递
[&]Type& param){函数语句}//lambda范围外的所有数据引用传递
[=,&a,&b]Type& param){函数语句}//除了a,b是按照引用传递外,其他变量按照拷贝传递

返回值

因为在定义lambda时没有显式的声明返回值,这就需要编译器根据return的数据的形式来分析其返回值,所以我们必须显示地指定返回值类型。
也可以使用->typename来表名返回类型。

用于定义一元谓词

针对algorithm中的find_if()要传递一元谓词,可以使用lambda函数对象传递。

//寻找vector容器中能被2整除的数
auto iEvenNum = find_if(v1.end()
						,v1.end()
						,[](const int& Num){return (Num%2==0)};

用于定义二元谓词

// 不区分大小写,对容器中的元素进行排序
   	vector<string> VecName;
    sort(VecName.begin(),
         VecName.end(),
         [](const string &s1, const stirng &s2){
        string str1 = s1;
        string str2 = s2;
        transform(s1.begin(),s1.end(),str1.begin(),tolower);
        transform(s2.begin(),s2.end(),str2.begin(),tolower);
        return (str1<str2); })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值