十分钟了解C++ Lambda表达式

PS : 练习代码在最后。

简述:

Lambda表达式从 [ ]  开始,这符号告诉我们与编译器我们正在创建一个lambda函数编译

然后是参数列表(),最后是函数体。PS:C++11会自动推断返回值,我们不需要写。


1.格式如下;

一般式: [] () { … };

最简版 : []{ } (也就是说其他都可以省略)

简版使用:[] { cout << "Alloa, friend!"; }(); 

 

2.返回值问题:

默认Lambda无返回,若只有一个简单返回值,编译器可自动推断

若写复杂lambda表达式(含特殊或多个返回值),则必须指定返回类型,例如:【】() -> int { return 1; }

 

3.变量捕获方式:

[ ] ==无需变量捕获

[&] ==需要变量捕获

[=] == 通过变量的拷贝捕获

[=,&foo] == 通过变量的拷贝捕获,但是用foo变量的引用捕获

[bar] == 通过复制捕获,不要复制其他

[this] == 捕获this指针对应成员, 实际上,你可以捕获这个指针的成员,你不需要显示地使用这个指针

即:

我们能够以一个在lambda之外声明一个变量,然后在lambda里面直接使用,在lambda函数在执行的时候,这些变量已经获取,当然这些需要告诉编译器,比如[]表示不会获取任何变量,而[&]告诉编译器执行变量捕获

 

4.Lambda与函数指针

C++11标准制定上,如果你使用一个lambda表达式,并且没有捕获任何变量,那么它可以像一个普通的函数来处理和分配函数指针

  1. typedef int (*func)();  
  2. func f = [] () -> int { return 1; };  
  3. f();  

 

5.Lambda可以配合委托使用,十分酸爽!

 

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
//Lambda test 
using namespace std;

class AddressBook
{
public:
	vector<string> addresses_;
	template<class Fun>
	vector<string> findMatchAddresses(Fun f)
	{
		vector<string> results;
		for(vector<string>::iterator iter = addresses_.begin(),
				end = addresses_.end();iter!=end;++iter) {
			if(f(*iter)) {
				results.push_back(*iter);
			}
		}
		return results;		
	}
	AddressBook()
	{
		for(int i=0;i<7;++i)
		{
			if(i>5)
				addresses_.push_back("SASA");
			else
				addresses_.push_back("7878");
		}
	}
		
}; 


AddressBook g_ab;
string name;
int main(void)
{
	//auto func = []() { cout<<"Hello Lambda"<<endl;};
	//func();

	[] { cout << "please enter name:"; }();  
	
	cin>>name;
	auto x = g_ab.findMatchAddresses([&](string &s){
		return (s.find(name)!=string::npos);
	});
	
	/*vector<string>::iterator it = x.begin();
	for(;it!=x.end();++it)
	{
		auto ss = *it;
		cout<<ss<<endl;
	}*/
	//酷炫代码 
	for_each(x.begin(),x.end(),[](string val)
		{ cout<<val<<endl;;
	} ); 
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值