C++11特性--Lambda函数

来源:互联网 发布:银河铁道之夜 知乎 编辑:程序博客网 时间:2024/06/06 20:06
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;
 }

原创粉丝点击