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表达式,并且没有捕获任何变量,那么它可以像一个普通的函数来处理和分配函数指针
- typedef int (*func)();
- func f = [] () -> int { return 1; };
- 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;
}