游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

C从函数指针函数对象到Lambda表达式让代码更有弹性更通用

  函数对象,由类实现,类有属性,实例化为对象后表现为对象的状态。类可以重载函数运算符(),对象对此运算符的调用看起来就如果函数的调用一样,不同的是,这是一个对象,所以有其状态,这是其与普通函数的独到之处,有其独特的适用场景。
  看下面的实例:includeiostreamincludelistincludeusingnamespacestd;boollargerthan80(doublex){returnx80;}voidfunc(listdoublev){listdouble::iteratorpfindif(v。begin(),v。end(),largerthan80);if(p!v。end()){coutpendl;}}intmain(){doublearr〔〕{66,88,55,44,66,77,99,86,67};listdoublelst(arr,arrsizeof(arr)sizeof(arr));func(lst);getchar();return0;}
  如果谓词函数想更改为boollargerthan60(doublex){returnx60;}
  显然这不是一种便捷的方法,把代码写死(硬编码,hardcoded)是不好的,于是,函数指针和函数对象就可以登场了:includeiostreamincludelistincludeusingnamespacestd;boollargerthan80(doublex){returnx80;}voidfunc(listdoublev){listdouble::iteratorpfindif(v。begin(),v。end(),largerthan80);if(p!v。end()){coutpendl;}}voidfunc2(listdoublev){classCLargerthan{intv;public:CLargerthan(intvv):v(vv){}storetheargumentbooloperator()(intx)const{returnxv;}compare};CLargerthanLargerthan(70);listdouble::iteratorpfindif(v。begin(),v。end(),Largerthan);if(p!v。end()){coutpendl;}}intmain(){doublearr〔〕{66,88,55,44,66,77,99,86,67};listdoublelst(arr,arrsizeof(arr)sizeof(arr));func(lst);func2(lst);getchar();return0;}
  显然,函数对象有更大的灵活性。
  通常重载函数调用运算符的函数体都只有几行代码,可以inline,由此,相对于函数指针来说,效率更高。与此同时,函数对象可以嵌在函数内定义,而使用函数指针引用的函数无法嵌套,所以使用函数对象可以让代码更加紧凑。
  函数对象带有状态。函数对象相对于普通函数是智能函数,这就如同智能指针相较于传统指针。因为函数对象除了提供函数调用符方法,还可以拥有其他方法和数据成员。所以函数对象有状态。即使同一个类实例化的不同的函数对象其状态也不相同,这是普通函数所无法做到的。而且函数对象是可以在运行时创建。
  每个函数对象有自己的类型:对于普通函数来说,只要签名一致,其类型就是相同的。但是这并不适用于函数对象,因为函数对象的类型是其类的类型。这样,函数对象有自己的类型,这意味着函数对象可以用于模板参数,这对泛型编程有很大提升。
  函数对象一般快于普通函数,因为其可以inline实现。函数对象一般用于模板参数,模板一般会在编译时会做一些优化。
  但函数对象这种代码的写法似乎有点冗余,于是Lambda表达式便登场了。
  Lambda表达式是从类创建函数的精简方式。这里讲的类,它仅有的成员就是函数调用运算符。Lambda表达式取消了类声明,并且使用了精简的符号来表示函数调用运算符的逻辑。classLessThan{public:booloperator()(inta,intb){returnab;}}
  上面的类只有有一个成员,就是重载了函数调用运算符,写了这么多,核心的语句就只有一句:returnab;
  同样的功能,Lambda表达式更简洁,更紧凑,更匿名。〔〕(autoa,autob){returnab;}
  以下是使用Lambda表达式的代码:voidfunc3(listdoublev){listdouble::iteratorpfindif(v。begin(),v。end(),〔〕(doublea){returna60;});if(p!v。end()){coutpendl;}}
  Lambda表达式是函数对象的语法糖。
  函数对象可以实现更复杂的功能,而用lambda表达式则需要复杂的引用捕捉。考虑一个可以计算均值的函数对象:classMeanValue{public:MeanValue():num{0},sum{0}{}voidoperator()(inte){num;sumnum;}doublevalue(){returnstaticcastdouble(sum)staticcastdouble(num);}private:intnum;intsum;};intmain(){vectorintv{1,3,5,7};MeanValuemvstd::foreach(v。begin(),v。end(),MeanValue{});coutmv。value()endl;output:2。5return0;}
  使用引用捕捉的lambda表达式:intmain(){intx10;autoaddx〔x〕(inta){returnax;};复制捕捉xautomultiplyx〔x〕(inta){returnax;};引用捕捉xcoutaddx(10)multiplyx(10)endl;输出:20100return0;}
  主要的语法形式:
  〔〕:默认不捕获任何变量;
  〔〕:默认以值捕获所有变量;
  〔〕:默认以引用捕获所有变量;
  〔x〕:仅以值捕获x,其它变量不捕获;
  〔x〕:仅以引用捕获x,其它变量不捕获;
  〔,x〕:默认以值捕获所有变量,但是x是例外,通过引用捕获;
  〔,x〕:默认以引用捕获所有变量,但是x是例外,通过值捕获;
  〔this〕:通过引用捕获当前对象(其实是复制指针);
  〔this〕:通过传值方式捕获当前对象;
  其参数还可以自动推断:autoadd〔〕(autox,autoy){returnxy;};intxadd(2,3);5doubleyadd(2。5,3。5);6。0
  ref:
  https:www。cnblogs。comAlainGaop10675201。html
  End

从小养成学习好习惯主题班会教案【教育目的】l通过这次活动,培养学生上课专心听,不讲话,不搞小动作;积极举手回答问题;作业认真仔细做,书写工整,按时上交不拖拉,有错主动来订正等良好学习习惯。2通过……边城必修五一、教学目标1、了解沈从文描绘的湘西风土人情。2、感受沈从文小说的语言特色。3、走进作者构筑的善与美的理想世界,体会人性之美。二、重、难点情景交融……金属化学性质一课的点滴体会在金属的化学性质一课的教学中,我从问题入手,恰倒好处地激发学生学习的积极性。上课开始时,我提出了不法分子常以黄铜当黄金,进行欺骗活动,你会不会上当受骗?你有多少种办法区别黄金和……世间最美的坟墓现代文阅读附答案(1)我在俄国所见到的景物再没有比托尔斯泰墓更宏伟、更感人的了。这将被后代怀着敬畏之情朝拜的庄严圣地,远离尘嚣,孤零零地躺在林阴里。顺着一条羊肠小道信步走去,穿过林间空地和灌木……集合的概念教案设计数学必修1:集合的概念目标:(1)使学生初步理解集合的概念,知道常用数集的概念及其记法(2)使学生初步了解属于关系的意义(3)使学生初步了解有限集、无限……东方明珠教学反思作为一位刚到岗的教师,教学是重要的工作之一,写教学反思可以很好的把我们的教学记录下来,那么问题来了,教学反思应该怎么写?以下是小编为大家收集的东方明珠教学反思,希望对大家有所帮……孟子两章教学设计及反思【三维目标导航】1、知识与能力:读准字音,划准节奏,初步揣摩文言文诵读技巧。辨析疑难字词,疏通疑难句意,积累文言词汇。整体感知课文内容,初步了解文章大意……有关通往广场的路不止一条的优秀教学设计【教学目标】、能正确认读并书写四个生字和一个多音字,能结合文本语境理解星罗棋布、络绎不绝、大喜过望等重要词语的意思。、能正确、流利、有感情地朗读课文,背诵父亲教导我……游山西村的教学设计方案【教学目的】、知识:背诵这首诗;理解诗的意境。、能力:诵读能力;联想、想象能力。、德育:陶冶美的情操。、重点目标:背诵此诗。、目标难点:理解诗的意……解直角三角形课堂教学反思在解直角三角形中,我们习惯于利用三角函数根据题目中已知的边角元素来求另外的边角元素。其实,有时候利用方程来解决这样的问题甚至能起到更好的效果。在《解直角三角形》中第四节船……画家和牧童的教案设计一、设疑导入先板书好画家写得大一些,牧童写的小一些,同学们今天我们要学习《画家和牧童》,谁来把课题读一读,你发现了什么?是啊,一个是有名的画家,一个是小小的牧童,那么画家……独角兽神话传说中的生物独角兽为神话传说中的一种虚构的生物。现行西方神话的独角兽则形如白马,额前有一个螺旋角,代表高贵、高傲和纯洁。有的故事中描述为长有一双翅膀,甚至还有独角兽是黑色的描述。西方……
湖南省取缔辖内全部网贷机构P2P业务IT之家10月17日消息10月16日据湖南省地方金融监督管理局官方发布公告,称2016年以来,湖南省P2P网贷行业一直在进行专项整治,至今未有一家平台完全合规通过验收。湖南省其……女星莫名遭催债电话疯狂骚扰,竟是粉丝借的贷IT之家10月29日消息日前,一位粉丝娄女士在黄牛手里买了偶像的手机号码,然后向网贷平台贷款的时候居然留下了偶像的手机号。因逾期未还款,催债平台疯狂给偶像打电话。报道称,……滴滴近期庆祝滴滴顺风车上线的红包链接均不是官方发放,不要轻易IT之家11月9日消息今日晚间,滴滴顺风车官方在微博表示,近期有不少用户反馈收到庆祝滴滴顺风车上线名义的红包链接,官方称这些都不是官方发放的,顺风车目前并未上线任何营销活动。……iOS14。1体验分享,一个为iPhone12做准备的版本iOS14。1正式版体验分享昨天凌晨苹果向所有用户推送了iOS14。1正式版系统,距离上周发布iOS14。1GM还不到一周的时间。更新包大小为:500MB左右,版本号:1……拜年短信,拜拜IT之家2月5日消息今年春节,IT之家编辑没有收到一条来自手机号码的拜年短信,此前的拜年短信彻底演变成了微信拜年,虽然发送的内容有可能还是短信内容,但微信拜年增加拜年红包、拜年……写一种小动物教学设计范文一、教学目标:1、能把一种动物的外形和它的活动情况有条理地写下来。2、培养喜爱小动物的情趣。二、课时安排:2课时第一课时1、谈话揭题。你最喜……经济常识第三课第一节第四框题(人教版)数学思维在政治课教学中的应用《提高企业经济效益》【教学内容分析】企业经济效益是企业一切经济活动的出发点和根本标准,也是现阶段我国国企改革的中心任务,教材内容是……男子变卖两套房打赏女主播,欠债后伪装女性诈骗已被抓获IT之家1月2日消息直播是目前较火的一种网络视听传媒方式,通过与观众的实时互动,以表演或其他才艺展示等方式获取观众打赏,从而进行盈利的一种网络行业。据市场星报消息,安徽滁……男子微信假扮美女加好友网恋,骗走红包2万多元IT之家12月28日消息IT之家友情提示,微信的性别及头像都是可以手动修改的,在遇到有美女头像且性别为女的陌生人索要红包及其他金钱交易时,需要提高警惕,不要轻易给陌生人转账、借……美团中国餐饮报告2019女性仍是餐饮消费主力3月28日晚间消息,美团点评今日在北京举办大数据餐饮新动能发布会,并联合餐饮老板内参发布《中国餐饮报告2019》。报告指出,过去一年中国餐饮市场规模已达4。2万亿,首次突破四万……佛山业主踢蚊子却踹飞电梯门,物业要求全额赔偿IT之家3月16日消息据国内媒体报道,广东佛山一男子乘坐小区电梯时,称因见蚊子想踢一脚,不料却把电梯门给踹飞了,导致电梯卡在楼层中间,后物业要求全额赔偿损失。视频地址:点……小学四年级下册语文古诗二首教学设计范文教学目标:1运用多种识字方法自主学习生字,会认5个生字;会写6个字;自主积累词语。2有感情地朗读课文,背诵课文。3感悟诗句的意思,并能展开想象,体会诗的意境,……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网