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); })