C++11新特性解析与应用 lambda部分

lambda  的[=],[&]方式, 根据lambda的实现知道:

=:方式为传值,在lambda定义的时候,初始化状态就确定了

&:方式为引用,那么引用的对象或者变量,会根据lambda执行的时候,再确定初始化状态  这一点很重要

我们可以用 typeid(lambda).name() 来看看不同编译器,对于lambda的类型到底是什么

lambda 默认是带有const 属性的,如果要在函数体内,改变捕捉变量的值,那么要加上mutable,去掉const属性

lambda 与 STL:

inline void func(int a)

{

cout<<a<<endl;

}

vector<int > vec{1,2,3,4,5};

for(auto iter=vec.begin();iter!=vec.end();++iter)

{

     func(*iter);

}

for_each(vec.begin(),vec.end(),func);

for_each(vec.begin(),vec.end(),[](int val){ cout<<val<<endl;});

哪种简单明了? 一目了然


   map<int,string> _map
   {
 
       {1,"hello "},
 
       {2,"china "},
 
       {3,"who "},
 
       {4,"are "},
 
       {5,"you "},
 
       {6,"?"},
 
   };
 
   for_each(_map.begin(),_map.end(),[](auto iter){cout<<iter.first<<":"<<(iter.second.c_str())<<endl;});

是不是这样用map,很爽?

  vector<int> vec{1,2,3,4,5};
 
   auto iter=find_if(vec.begin(),vec.end(),[](int val){return val==2;});
 
    cout<<*iter<<endl;
 

这样用 find_if ,一眼就知道你要干什么。

 for_each(vec.begin(),vec.end(),[](int & val){val+=5;});
 
   for_each(vec.begin(),vec.end(),[](const int val){cout<<val<<endl;});

容器自增5

 vector<int> vec(10);
 
   generate(vec.begin(),vec.end(),[](){return rand()%10;});
 
   for_each(vec.begin(),vec.end(),[](const int val){cout<<val<<endl;});

随机值初始化容器


lambda更多的时候,是配合STL的经过调优后的算法使用,可以大大节省开发时间与精力的投入。

但是要把lambda用好,不经过长期的磨练,踩足够多的坑,也是很难完全掌握的。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值