十分钟了解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
#include
#include
#include
//Lambda test 
using namespace std;

class AddressBook
{
public:
	vector addresses_;
	template
	vector findMatchAddresses(Fun f)
	{
		vector results;
		for(vector::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"<>name;
	auto x = g_ab.findMatchAddresses([&](string &s){
		return (s.find(name)!=string::npos);
	});
	
	/*vector::iterator it = x.begin();
	for(;it!=x.end();++it)
	{
		auto ss = *it;
		cout<


你可能感兴趣的:(编程语言)