pb通过对象名称调用对象_C++ 可调用对象(二)

点击上方“蓝字”,发现更多精彩。本文在前一篇关于函数对象、bind 函数的基础上,对 C++ 中 lambda不表达式的使用进行总结。lambda01PART定义一个 lambda 表达式表示一个可调用的代码单元,可以理解为是一个未命名的内敛函数。类似任何函数,一个 lambda 具有返回类型、参数列表和函数体;和普通函数不同, lambda 必须使用尾置返回来指定返回类型。

9580d14dbf09dd103f91b9d598bdb4a9.png

①.捕获列表捕获列表是一个 lambda 所在函数中定义的局部变量的列表,捕获列表能够捕捉上下文中的变量以供 lambda 使用。捕获列表可以为空,但 [] 不可以省略,编译器依次来判断接下来的代码是否是 lambda 表达式。②.参数列表和普通函数的参数列表一致,如果不需要参数传递,则可以连同括号 () 一起省略。lambda 中参数不能有缺省值,也不能有无名参数。③.mutable默认情况下,对于一个值被拷贝的变量,lambda 不会改变其值,加上 mutable 修饰符后,可以修改传递进来的拷贝。在使用 mutable 修饰符时,参数列表部分不可省略,但列表可以为空。④.返回类型标识函数返回值的类型,当返回值为 void,或者函数体中只有一处 return 时可用省略。⑤.函数体标识函数的实现,内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。函数体不能省略,但函数体可以为空。02PART捕获列表

①.概念

一个 lambda 通过将局部变量包含在其捕获列表中来指定将会使用这些变量,只能使用明确指明的变量;变量捕获方式可以传值捕获,也可以传引用捕获。

②.按值捕获变量

在捕获列表中指定变量名字,类似传值的参数,被捕获的变量值将在 lambda 创建时被拷贝。

90808b18c83f2c06945617bc42a6cd64.png

③.按引用捕获变量

用 & 引用捕获,一个以引用方式捕获的变量,在 lambda 中被使用时,实际上使用的引用所绑定的对象。

3da5ff2f1c5f402aa422c6c873f71c09.png

④.多参数捕获

捕获列表中可以指定捕获多个参数,并且可以为每个参数指定捕获方式。

6442e5bf7be5af8abff6f82a304410a2.png

⑤.隐式按值捕获

使用 [=] 表示按值捕获 lambda 所在范围内所有可见的局部变量。

dfe8911bd390d38e21a1387e9f122f06.png

⑥.隐式按引用捕获

使用 [&] 表示按引用方式捕获 lambda 所在范围内所有可见的局部变量。

2456cc8204ff5759b344912905f1d0c6.png

⑦.隐式混和捕获

使用 [=,prams] 表示除 xxx 按引用捕获外,其他所有参数按值捕获;使用 [&,prams]  表示除 xxx 按值捕获外,其他所有参数按引用捕获。

2df142e809d450c7b5568042e27e0d2a.png

04PART指定返回类型

如果一个 lambda 函数体包含了 return 之外的任何语句,则编译器假定返回类型为 void,此时我们必须指定返回值类型。

3228b03c8e2b7783b4c15dbf2007f70a.png

05PARTlambda 是函数对象

定义一个 lambda ,编译器会生成一个与 lambda 对应的新的类类型。当向一个函数传递一个 lambda 时,同时定义了一个新类型和该类型的一个对象,生成的类包含所捕获变量对应的数据成员,数据成员在类创建时被初始化。

int sum = 0;std::vector<int> vec = { 1,2,3,4,5 };std::for_each(begin(vec), end(vec), [&sum](int x){sum += x;});

上述代码被编译器翻译后变为:

class lambda_b{private:    int* m_pSum;public:    lambda_b(int* pSum)    {        m_pSum = pSum;    }    void operator()(int x) const {        *m_pSum += x;    }};int sum = 0;std::vector<int> vec = { 1,2,3,4,5 };std::for_each(begin(arry), end(arry), lambda_b(&sum));
06PARTlambda 使用

lambda 表达式实际为一个函数对象,可以把匿名函数保存在变量当有名函数来使用。

①.使用 auto 保存

int a = 1;int b = 2;//使用 auto 保存 lambda auto func = [a, &b](int c)mutable ->int { b = a + c; return a; };//做有名函数使用  cout << b << "  "<< func(10) << endl;

②.函数指针保存

当 lambda 的捕获外部变量列表为空时,可使用普通函数指针来保存。

//使用函数指针保存 lambda int(*func1)(int) = [](int x) {return x; };//函数调用int a = func1(20);

③.使用 std::function 模板类型

#include std::function<float(int,float)> fun1 = [](int x, float y) { return x + y; };float a = fun1(12,1.2);//函数调用

函数对象C++ 可调用对象(一)

aaf3062ad170f6c098dad7b979b7edb1.png扫码关注持续获取最新文章c++学习 算法与数据结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交换机虚拟化和堆叠的区别_核心交换机和普通交换机有何区别?

提起核心交换机与普通交换机有什么区别&#xff1f;相信很多朋友都有点迷惑&#xff0c;今天我们一起来了解下。核心交换机并不是交换机的一种类型&#xff0c;而是放在核心层(网络主干部分)的交换机叫核心交换机。一般大型企业网络和网吧需要购买核心交换机来实现强大的网络扩…

tmpfiles.d导致的unix:///tmp/supervisor.sock no such file坑(待续)

为什么80%的码农都做不了架构师&#xff1f;>>> 系统环境: CentOS Linux release 7.1.1503 (Core) supervisor 3.3.1今天初七&#xff0c;刚放完假需要去supervisor restart下程序。发现报了这个错误。但是看supervisord的进程还在运行&#xff0c;项目代码也还在…

springMVC两种方式实现多文件上传及效率比较

springMVC实现多文件上传的方式有两种&#xff0c;一种是我们经常使用的以字节流的方式进行文件上传&#xff0c;另外一种是使用springMVC包装好的解析器进行上传。这两种方式对于实现多文件上传效率上却有着很大的差距&#xff0c;下面我们通过实例来看一下这两种方式的实现方…

c语言 个位,如何才能给C语言增加几个位操作函数

在汇编语言中有直接对位进行操作的指令&#xff0c;如置位、复位、位取反、测试某一位等&#xff0c;这对于硬件操作十分方便&#xff0c;在C语言中尽管也提供了一些位操作手段&#xff0c;如按位与、按位或、按位取反等&#xff0c;但它们是对一个字节进行操作&#xff0c;如要…

hsrp 切换_HSRP、VRRP、GLBP | 网络工程师之网关高可用、冗余

在RS的学习过程中我们接触到很多网络技术&#xff0c;后面就把工作中常用的拿来与大家分享&#xff0c;本次我们来分享网关冗余技术。当我们的网关设备无法使用堆叠(VSS,istack&#xff0c;IRF)&#xff0c;或者不同厂商设备的时候&#xff0c;非常有效&#xff0c;能够提供网关…

Linux文件系统详解

从操作系统的角度详解Linux文件系统层次、文件系统分类、文件系统的存储结构、不同存储介质的区别(RAM、ROM、Flash)、存储节点inode。本文参考&#xff1a; http://blog.chinaunix.net/uid-8698570-id-1763151.htmlhttp://www.iteye.com/topic/816268http://soft.chinabyte.co…

opencv机器学习线性回归_机器学习(线性回归(二))

Lasso与岭回归的同和异Lasso、岭回归都可以预防模型过拟合Lasso回归惩罚项为L1正则&#xff0c;岭回归为L2正则Lasso回归可用来特征选择&#xff0c;岭回归则不能Lasso回归用坐标下降法求解&#xff0c;岭回归用梯度下降法求解。为什么Lasso可用于特征选择&#xff0c;而岭回归…

把EXCEL用程序导入到ORACLE中(SpringMVC+MyBatis)

前提&#xff1a;项目中需要把EXCEL数据批量导入oracle中两张表中。如是用到了poi技术。分别导入poi-3.11-beta2.jar和poi-ooxml-schemas-3.9.jar这两个包。EXCEL数据如下 第一步&#xff1a;修改spring框架配置文件。 springmvc-servlet.xml加上&#xff1a; <!-- 文件上传…

access实例_西门子PLC1200组态王跟Access数据库-⑥组态王变量

西门子PLC1200&#xff0c;组态王跟Access数据库--⑥组态王变量组态王的变量设置1.0 变量设置如下图所示&#xff0c;选择数据词典&#xff0c;里面是系统变量跟新建的变量&#xff0c;选择新建1.1 如下图&#xff0c;从上往下依次&#xff0c;变量名(这个应该知道)&#xff0c…

Android 撸起袖子,自己封装 DialogFragment

前言 具体的代码以及示例我都放上 Github 了&#xff0c;有需要的朋友可以去看一下 DialogFragmentDemos&#xff0c;欢迎 star 和 fork. 本文的主要内容 DialogFragment 是什么创建通用的 CommonDialogFragment实现各种类型的 DialogFragment在写正文之前&#xff0c;先来一波…

as模拟器文件夹路径_EGG Switch手机模拟器怎么用?中文教程来了......

大家好&#xff0c;小鸡妹我又来啦。自从昨天曝光了美国NX工作室的EGG模拟器之后&#xff0c;推文底下就多了一千多条留言&#xff0c;说啥的都有。不过小鸡妹大概总结了一下&#xff0c;发现下面这几条问题&#xff0c;出现的频率最高&#xff1a;① 找不到网址&#xff1b;②…

郁金香汇编代码注入怎么写看雪_世界黑客编程大赛冠军的汇编代码 你见过吗?...

前几天发布了一篇“雷军22年前写的汇编代码”的文章&#xff0c;引起网友的热议。有人说汇编是最牛逼的编程语言&#xff0c;没有之一。汇编语言确实厉害&#xff0c;不知道你有没有见过世界黑客编程大赛冠军的作品?雷军编写的的汇编代码有 网友分享了97年Mekka ’97 4K Intro…

变位齿轮重合度计算公式_齿轮“模数”是如何计算的?

模数是决定齿轮大小的因素。齿轮模数被定义为模数制轮齿的一个基本参数&#xff0c;是人为抽象出来用以度量轮齿规模的数。目的是标准化齿轮刀具&#xff0c;减少成本。直齿、斜齿和圆锥齿齿轮的模数皆可参考标准模数系列表。工业定义&#xff1a;齿轮的分度圆是设计、计算齿轮…

获取freemarker处理后的内容

相信很多人都用过freemarker&#xff0c;或做视图&#xff0c;或模板&#xff0c;或生成静态文件等,但是有多少人做过这样的应用&#xff0c;通过模板后&#xff0c;不是要输出静态的内容&#xff0c;而是直接在代码中获取处理模板后的内容&#xff0c;研究了下API,freemarker里…

c4.5算法python实现_算法:用Python实现—最优化算法

今天给大家分享一下算法&#xff0c;用python来实现最优化算法。废话不多说&#xff0c;直接上代码&#xff1a;一、二分法函数详见rres&#xff0c;此代码使该算法运行了两次def asdf(x): rres8*x**3-2*x**2-7*x3 return rresi2left0right1while i>0 : i i-1 …

vs怎么更改编译的堆空间_再见吧 buildSrc, 拥抱 Composing builds 提升 Android 编译速度...

前言长期以来困扰我们的一个问题就是构建速度&#xff0c;AndroidStudio 的构建速度严重影响 Android 开发者的工作效率&#xff0c;尤其是更新一个版本号&#xff0c;导致整个项目重新构建&#xff0c;在网络慢的情况下&#xff0c;这是无法忍受的。buildSrc 这种方式&#xf…

java map的遍历

转载地址&#xff1a;http://www.cnblogs.com/shenliang123/archive/2012/08/28/2660705.html -------------------------------------------------------------------------------------------------------------------- java中的遍历 import java.util.Collection; import j…

android悬浮功能实现,Android实现系统级悬浮按钮

本文实例为大家分享了Android系统级悬浮按钮的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下具体的需求1、就是做一个系统级的悬浮按钮&#xff0c;就像iPhone 桌面的那个悬浮按钮效果一样&#xff0c;能随意拖动&#xff0c;并且手一放开&#xff0c;悬浮按钮就自动…

oracle decode_错过血亏!一文搞懂Oracle锁相关视图及相关操作

本文主要研究锁的相关视图&#xff0c;以及锁的相关操作&#xff0c;通过视图查锁的问题。 一、v$transaction视图第一个视图是v$transaction&#xff0c;就是Oracle数据库所有活动的事务数&#xff0c;所有活动的事务每一个活动的事务在这里有一行。v$transactionXIDUSN表示当…

Linux文件系统与命令行

什么是命令行? 接收键盘命令并将其传给操作系统执行的程序(用于输入和管理命令的程序),统称命令行,也叫: Shell&#xff0c;几乎所有Linux发行版都提供了一个 Shell 程序,叫做: Bash (Bourne-Again Shell, 因为最初的 Shell 是由 Steve Bourne 编写的原始 Unix 程序, Again 表…