c++11(3) 一、LambdaLambda的介绍Lambda的使用跟仿函数的使用差不多,一般是一些实现的短而小体的函数在一定的情况下嫩有很好的效果语法表达式:[] (函数参数)-(返回类型){函数体实现},它最终返回的是调用对象,不是内置类型和类类型,所以无法用具体类型接受它,所以要用auto接受,这个会是在编译时期自动推导类型,上面说了他本质是个防函数那就说明他返回的是类类型,但你不知道它的名字不同编译器的给的名字不同所以就无法使用具体类型去接受,所以也是为什么要用auto自动推导类型Lambda的应用我目前还没有学到linux还没学,关于线程用这个可能较多,所以就举一些普通场景的例子看看怎么使用即可autof1[](inta,intb)-int{returnab;};coutf1(1,1)endl;这种是最基本的写法,f1接受的就是函数对象,又因为Lambda中重载了operator()所以也就能像函数一样传参调用,这里的参数就相当于最后是给Lambda里的operator()里的参数,函数体就是这里面的函数体[] 是捕获列表是接受当前Lambda中的局部域的存在的值或者是全局域的值intc100;intd10;autof1[c,d](inta,intb)-int{//c;/*d;*/coutcendl;coutdendl;returnab;};coutf1(1,1)endl;autof2[c,d](inta,intb)-int{c;d;coutcendl;coutdendl;returnab;};就如图f1这样捕捉叫做显示捕捉,捕捉到的值可以在当前Lambda中的函数体使用,但这种是显示传值捕捉不能改变当前值,比如上面c和d要在函数体内的话会报错,这就相当于捕获的时候加了const修饰了它们,但如果是显示引用捕捉的话就可以改变,就在捕获的变量前加个就行,如f2的形式写,c和d就能改变了第二种是隐式捕捉,就是在捕捉列表中加 就可以不用传参默认吧当前局部域和全局域的变量默认在捕捉列表里面,但这种是隐式传值捕捉,依然不能改变所以用就是隐式引用捕捉,这个就可以改变变量的值autof3[](inta,intb)-int{//c;//d;coutcendl;coutdendl;returnab;};autof4[](inta,intb)-int{c;d;coutcendl;coutdendl;returnab;};当然也可以混合使用,但是用了其中一个隐式捕捉的语法,就不能后面的就不能显示用相同的了比如如下,后面那个c不能传值捕捉,要写引用捕捉相反前面写了隐式引用捕捉,那后面不能显示写引用捕捉.如果既包括显示捕捉和隐式捕捉,隐式捕捉的方式要写在最前面intc1;intd2;intx3;autof5[,c](inta,intb)-int{c;//d;//x;coutcendl;coutdendl;coutxendl;returnab;};个人认为这个在我当前的知识量中,实用的是在排序中,如果是一个指针或者类类型去比较,默认的比较可能不符合我们的预期,就需要写仿函数,有了这个就可以直接在sort中的参数写并且有些参数是可以省略的:1.捕捉为空也不能省略.2、参数为空可以省略.3、返回值可以省略可以通过返回对象⾃动推导4、函数体不能省略所以下面的sort可以简写成sort(v.begin(),v.end(),[](constGoodsgl,constGoodsgr){returngl._evaluategr._evaluate;});structGoods{string _name;// 名字double_price;// 价格int_evaluate;// 评价// ...Goods(constchar*str,doubleprice,intevaluate):_name(str),_price(price),_evaluate(evaluate){}};vectorGoodsv{{苹果,2.1,5},{⾹蕉,3,4},{橙⼦,2.2,3},{菠萝,1.5,4}};sort(v.begin(),v.end(),[](constGoodsgl,constGoodsgr)-bool{returngl._evaluategr._evaluate;});return0;二、包装器——functionfunction的介绍它的作用就是实例化的对象可以储存这些可调用对象的,比如仿函数,Lambda,和下面再讲的bind因为容器存不了这样的值,只能存内置类型和类类型的相同的值,有了function就可以解决容器不能存可调用对象的短板语法表达式function返回类型(参数1参数2...参数n),并且要function的返回类型和参数类型和参数个数和存的可调用对象的要是一样的structcmp{booloperator()(constinta,constintb){returnab;}functionbool(constint,constint)fc1cmp();functionint(constint,constint)fc2[](constinta,constintb){returnab;};coutfc1(8,4)endl;coutfc2(8,4)endl;};function的原理简单来说和底层是仿函数插差不多,就是个类模板用的一般是特化版本的,它里面也重载了operator()相当于你传入的参数传进function的operator()的形参中,然后再调用原来你的仿函数的operator()或Lambda的operator()然后把它们的返回值传到这里最后完成调用,大概过程如下图function的应用那我们就可以结合容器来使用这个,比如下面这道力扣题:150.逆波兰表达式求值解题思路为遇到数字就入栈遇到运算符就出栈顶两元素进行计算后的结果再入栈,最后的栈顶元素就是最后的值传统的解题步骤:classSolution{public:intgetsum(stackintst,stringch){intrightst.top();st.pop();intleftst.top();st.pop();if(ch){returnleftright;}elseif(ch-){returnleft-right;}elseif(ch*){returnleft*right;}else{returnleft/right;}}intevalRPN(vectorstringtokens){inti0;stackintst;// 如果不是运算符入栈// 是运算符先出栈把计算结果入栈for(string str:tokens){if(str||str-||str*||str/){intretgetsum(st,str);st.push(ret);}else{st.push(stoi(str));}}returnst.top();}};结合Lambda和function首先定义map运算符号当key把上面传统的建立函数去算是上面运算符号变为利用Lambda作为value来存进function中,l利用map的对key的计数函数判断当前str是否为运算符,是就执行出栈计算,计算结果入栈,push这里opfunction[str]是返回value的value是看调用对象然后再使用它的operator()传入参数就能把当前运算符的计算的值入栈classSolution{public:intevalRPN(vectorstringtokens){stackintst;mapstring,functionint(constint,constint)opfunction{{,[](constintleft,constintright)-int{returnleftright;}},{-,[](constintleft,constintright)-int{returnleft-right;}},{*,[](constintleft,constintright)-int{returnleft*right;}},{/,[](constintleft,constintright)-int{returnleft/right;}}};// 如果不是运算符入栈// 是运算符先出栈把计算结果入栈for(string str:tokens){if(opfunction.count(str)){intrightst.top();st.pop();intleftst.top();st.pop();st.push(opfunction[str](left,right));}else{st.push(stoi(str));}}returnst.top();}};它还可以去储存别人的成员函数,对于静态成员函数,不用传this指针,对于非静态成员函数,需要传this指针然而function的参数是this指针的指针,左值引用右值引用或者对象都行,只是可传的参数可能有限制而已classPlus{public:Plus(intn10):_n(n){}staticintplusi(inta,intb){returnab;}doubleplusd(doublea,doubleb){return(ab)*_n;}private:int_n;};functionint(int,int)f1Plus::plusi;Plus ps;functiondouble(Plus*,double,double)f2Plus::plusd;functiondouble(Plus,double,double)f3Plus::plusd;functiondouble(Plus,double,double)f4Plus::plusd;functiondouble(Plus double,double)f4Plus::plusd;coutf2(ps,1.0,2.0)endl;coutf3(ps,1.0,2.0)endl;coutf4(Plus(),1.0,2.0)endl;coutf5(ps,1.0,2.0)endl;三、bindbind是⼀个函数模板它也是⼀个可调⽤对象的包装器可以把他看做⼀个函数适配器对接收的可调⽤对象进⾏处理后返回⼀个可调⽤对象。bind可以⽤来调整参数个数和参数顺序。bind也在functional这个头⽂件中。语法表达式:调⽤bind的⼀般形式auto newCallable bind(callable,arg_list);其中newCallable本⾝是⼀个可调⽤对象arg_list是⼀个逗号分隔的参数列表对应给定的callable的参数。当我们调⽤newCallable时newCallable会调⽤callable并传给它arg_list中的参数。arg_list中的参数可能包含形如_n的名字其中n是⼀个整数这些参数是占位符表示newCallable的参数它们占据了传递给newCallable的参数的位置。数值n表⽰⽣成的可调⽤对象中参数的位置_1为newCallable的第⼀个参数_2为第⼆个参数以此类推_1/_2/_3…这些占位符放到placeholders的⼀个命名空间中usingplaceholders::_1;usingplaceholders::_2;usingplaceholders::_3;intsubx(inta,intb){return(a-b)*10;}autof5bind(subx,_2,_1);coutf5(10,20)endl;autof6bind(subx,10,_1);coutf6(20)endl;f5表示的就是参数交换位置,传参的流程如下图,就是_1就是第一个参数的值,_2就是第二个参数的值,然后回调原函数就是被bind的函数的参数对应参数就行调整参数就是把其中一个值确定,如f6的流程图,反正就要记住,调用函数的参数一定是先给_1再给_2以此类推传参原函数则是bind后的参数对齐传给原函数的参数注意它们都能被function对象接收

相关新闻

最新新闻

宝安沙井EMC-RS辐射抗扰度预约测试流程

宝安沙井EMC-RS辐射抗扰度预约测试流程

在深圳宝安沙井(以中鉴检测及周边的3米法电波暗室实验室为例)预约 EMC-RS(射频电磁场辐射抗扰度)​ 测试的流程,通常分为需求确认、商务排期、送样测试、报告交付四个阶段,具体步骤如下:一、前期…

2026/7/22 15:57:55
VirtualLab Fusion:为光线追迹生成光线

VirtualLab Fusion:为光线追迹生成光线

在镜头系统的光线追迹中,光线起源于物点,并且通常针对光阑进行特定选择,例如,主光线穿过光阑的中心。如果我们从物理光学的角度来看这条光线的选择,我们会发现光线与球面波的波前正交,球面波的波前起始于物…

2026/7/22 15:57:55
USB主机控制传输:从协议状态机到错误处理的嵌入式实践

USB主机控制传输:从协议状态机到错误处理的嵌入式实践

1. USB主机模式控制传输:从协议到实践的核心逻辑 搞嵌入式USB主机开发,最让人头疼的往往不是写代码,而是理解那一堆协议状态机和寄存器位。手册上写得密密麻麻,但真到了调试阶段,一个NAK超时或者STALL响应就能让你卡上…

2026/7/22 15:57:55
私教服务 | 测试组长深夜求助:职级晋升到底怎么评才公平?

私教服务 | 测试组长深夜求助:职级晋升到底怎么评才公平?

关注 霍格沃兹软件测试开发 公众号,回复「资料」, 领取人工智能测试开发技术合集一场关于测试职级体系建设的深度对话夜深了,手机那头传来一声“喂”,一场关于测试职级认证的深度咨询就此展开。某互联网公司的测试组长最近很焦虑。公司开始建…

2026/7/22 15:57:55
console.log() 用法

console.log() 用法

console.log() 就是把你想看的内容“打印”到浏览器控制台(Console)里,方便你调试和查看数据。1. 基本语法和意思javascriptconsole.log(你要打印的内容);console:浏览器的“控制台”对象(内置工具).&#…

2026/7/22 15:57:55
Android随笔-MMKV

Android随笔-MMKV

一、MMKV 是什么 MMKV 是微信团队开源的一款基于 mmap 内存映射的高性能 key-value 存储组件,底层序列化采用 Protobuf,支持加密、多进程共享、匿名内存等特性。它在微信内部从 2015 年使用至今,后移植到 Android、iOS、macOS、Windows、POSI…

2026/7/22 15:52:55

月新闻