boost学习之-Lambda

来源:互联网 发布:苹果mac充电正常灯不亮 编辑:程序博客网 时间:2024/04/30 01:17

要点:

1 c++是面向对象的语言,尽量把所以一切东西看成对象,包括数据类型,函数,表达式,所以把这些东西转换为对象时非常关键的,

    boost基本上就是把什么都看做是对象来处理,这样把一般函数或表达式转化为函数对象很重要,同前一次说的bind,和这一次要学习

   的lambda,本质的作用就是把函数或表达式转换为函数对象;lambda可以把表达式转换为函数对象,避免了程序中写很多仿函数,程序

  中太多的仿函数定义也是比较麻烦的,因为很多仿函数仅仅是用一次;lambda体现出优势了;

2 以例子开始:

   (std::cout << _1 << " " << _3 << " " << _2 << "!\n")("Hello","friend","my");

    上面就是一个lambda表达式,本质上是函数对象;这里也用了占位符_1...;这些占位符的本身也是函数对象;看下面的:

    boost::function<void(int,int,int)> f= std::cout << _1 << "*" << _2 << "+" << _3 << "=" <<_1*_2+_3 << "\n";

     f(1,2,3);

     这里更加明显体现了lambda是函数对象的本质了;

3 占位符最多有9个,但是如果9个都用完了怎么办?

   既然占位符也是函数对象,主要多出来的用函数对象来代替即可,所起的作用是一样的;

   这里转换为函数对象的方法也是bind,但是不是上次学的bind,而是boost/lambda/bind.hpp里面的bind,用法和上次学的bind基本一样

   例子:

     typedef std::map<int,std::string> type;

     type keys_and_values;

     。。。

     std::for_each( keys_and_values.begin(),keys_and_values.end(),std::cout << constant("key=") <<bind(&type::value_type::first,_1) << ", value="<<     bind(&type::value_type::second,_1) << '\n');

    上面的constant, 它创建一个无参函数对象;

4 使用ptr_fun, mem_fun, mem_fun_ref 时,想想是否可以用lambda来代替

5 使用lambda来简化代码编写

   int main() {

     using namespace boost::lambda;

     std::vector<int> vec(3);vec[0]=1;vec[1]=2; vec[2]=3;

     std::for_each(vec.begin(),vec.end(),_1+=10);//么个元素加10

      std::for_each(vec.begin(),vec.end(),_1-=10);

      std::for_each(vec.begin(),vec.end(),_1*=3);

     std::for_each(vec.begin(),vec.end(),_1/=2);

     std::for_each(vec.begin(),vec.end(),_1%=3);}

     看看多么简洁;

6 当bind绑定函数对象时,要指定返回类型  

std::transform(vec.begin(),vec.end(),vec.begin(),  bind<int>(var(ap),_1));
7 如果函数对象从unary_function/binary_function继承,就不需要显示指定返回类型了,因为这两个里面都有result_type的定义

    从这连个东西继承也是函数对象的标准写法,现在看到标准写法的重要了吧,因为更能与标准兼容

8 lambda表达式的控制

   if_then(_1<5,std::cout << constant("Less than 5")))(3);

  (if_(_1==0) [std::cout << constant("Nothing")].else_[std::cout << _1])(make_const(0)); 

  int val1=1;  int val2=4;  (while_loop(_1<_2,  (++_1,std::cout << constant("Inc...\n"))))(val1,val2);
    程序很难读,难以理解,不建议使用。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 不知道微信账号的公众号密码怎么办 微信公众号充话费充错号码怎么办 蜻蜓商城三天免流业务退不了怎么办 日上免税店提货日期写错了怎么办 微信公众平台账号名密码忘了怎么办 有人扬言要搞垮我的店铺怎么办 招行信用卡签到积分未领取怎么办 怎么办照片发送到邮微信箱里去 苹果手机备忘录没刪除就没了怎么办 因恶意刷公众号而被微信封号怎么办 禁停路段发生剐蹭怎么办办 新三板公司退市了 小股东怎么办? 爱用商城发货没有物流信息怎么办 拼多多的快递的运单号发错了怎么办 追光娱乐账号被别人盗用了怎么办啊 用鲁大师检测硬盘出现损坏怎么办 客户拖款迟迟不给给怎么办 百度云盘文件密码忘记了怎么办 用来注册亚马逊的公司注销了怎么办 亚马逊中国卖家太多美国卖家怎么办 付款了!卖家不想卖了怎么办? 手机通讯录同步助手密码忘了怎么办 毕业生学位信息照片上传错了怎么办 报名计算机二级照片上传很慢怎么办 网上报名时照片上传错了怎么办 特岗教师报名时照片上传模糊怎么办 百家号申请过新手被拒绝三次怎么办 6岁儿童个子高不长肉体形瘦怎么办 网页游戏加载完毕卡了不动怎么办 小番茄未成熟下面就坏掉是怎么办 千牛快捷短语界面变得好宽怎么办 申请大王卡手机号填错了怎么办 别人盗用我手机号申请微信号怎么办 淘宝支付宝里没钱了买家退款怎么办 如果外包把员工社保忘交了怎么办 外包工人没有和包工头的证据怎么办 试用期辞职公司给交的社保怎么办 单位给交员工不想交社保怎么办 淘宝收不到卖家的信息怎么办 不小心把微信聊天记录删掉了怎么办 不小心把打印机驱动删除了怎么办