C++11特性--Lambda函数
·
1.Lambda函数
*对于接受函数指针或函数符的函数,可以用匿名定义(lambda)作为其参数。
*仅当Lambda表达式完全由一条返回语句组成时,自动类型推断才管用,否则需要使用新增的返回类型后置语法
*当没有返回值时,推断为void
Example:
[](int x){ return x%2==1;}
解析:
[]代替了函数名,这里自动推断出返回类型为bool,上面语句等效于
[](int x)->bool{ return x%2==1;}
int main()
{
vector<int> vec{1,2,3};
int count=count_if(vec.begin(),vec.end(),[](int x)->bool{ return x%2==1;});
cout<<count<<endl;//2
return 0;
}
*可以给lambda指定一个名称
Example:
int main()
{
auto pf = [](int x)->bool{ return x%2==1;};
vector<int> vec{1,2,3};
int count=count_if(vec.begin(),vec.end(),pf);
cout<<count<<endl;//2
return 0;
}
*可以像使用常规函数那样使用有名称的lambda
Example:
int main()
{
auto pf = [](int x)->int{ return x%2;};
cout<<pf(3)<<endl;//1
return 0;
}
*lambda可以访问作用域内的任何动态变量:要捕获要使用的变量,可将名称放在[]内
[var]:按值访问变量var
[&var]:按引用访问变量var
[&]: 按引用访问作用域内所有动态变量
[=]: 按值访问作用域内所有动态变量
还可以混合使用两种方式
[&,var]:按引用访问作用域内所有动态变量,按值访问变量var
.......
Example:
int main()
{
int cnt1=0,cnt2=0;
vector<int> vec{1,2,3};
for_each(vec.begin(),vec.end(),[&cnt1](int x){ cnt1+= x%2==1;});
cout<<cnt1<<endl;//2
cnt1=0;
for_each(vec.begin(),vec.end(),[&](int x){ cnt1+= x%2==1; cnt2+= x%2==0;});
cout<<cnt1<<ends<<cnt2<<endl;//2 1
return 0;
}
*对于接受函数指针或函数符的函数,可以用匿名定义(lambda)作为其参数。
*仅当Lambda表达式完全由一条返回语句组成时,自动类型推断才管用,否则需要使用新增的返回类型后置语法
*当没有返回值时,推断为void
Example:
[](int x){ return x%2==1;}
解析:
[]代替了函数名,这里自动推断出返回类型为bool,上面语句等效于
[](int x)->bool{ return x%2==1;}
int main()
{
vector<int> vec{1,2,3};
int count=count_if(vec.begin(),vec.end(),[](int x)->bool{ return x%2==1;});
cout<<count<<endl;//2
return 0;
}
*可以给lambda指定一个名称
Example:
int main()
{
auto pf = [](int x)->bool{ return x%2==1;};
vector<int> vec{1,2,3};
int count=count_if(vec.begin(),vec.end(),pf);
cout<<count<<endl;//2
return 0;
}
*可以像使用常规函数那样使用有名称的lambda
Example:
int main()
{
auto pf = [](int x)->int{ return x%2;};
cout<<pf(3)<<endl;//1
return 0;
}
*lambda可以访问作用域内的任何动态变量:要捕获要使用的变量,可将名称放在[]内
[var]:按值访问变量var
[&var]:按引用访问变量var
[&]: 按引用访问作用域内所有动态变量
[=]: 按值访问作用域内所有动态变量
还可以混合使用两种方式
[&,var]:按引用访问作用域内所有动态变量,按值访问变量var
.......
Example:
int main()
{
int cnt1=0,cnt2=0;
vector<int> vec{1,2,3};
for_each(vec.begin(),vec.end(),[&cnt1](int x){ cnt1+= x%2==1;});
cout<<cnt1<<endl;//2
cnt1=0;
for_each(vec.begin(),vec.end(),[&](int x){ cnt1+= x%2==1; cnt2+= x%2==0;});
cout<<cnt1<<ends<<cnt2<<endl;//2 1
return 0;
}
更多推荐
所有评论(0)