网站首页 > 技术文章 正文
lambda表达式是指能够捕获作用域中的变量的无名函数对象,狭义的理解,就是匿名函数。
无论是在项目中,还是在开源网站,总是能够看到lambda的身影。
为了能够轻松阅读代码,进而熟练地使用,本文首先将讲解lambda表达式的基本语法、三种基本用法,然后介绍五种实际的应用场景,最有总结说明lambda表达式的作用。
表达式语法
首先看下lambda表达式的基本语法,它由五部分组成,分别为捕捉列表,参数列表,修饰符,返回类型和函数体。
捕捉列表可以设定当前是值传递方式[=]或者引用传递方式[&], 参数列表则就是函数的参数,返回类型表示函数体执行完成之后返回的类型、比如整型int、布尔型bool等。函数体则是实现实现的功能。另外,由于lambda表达式默认返回是const类型,如果想要取消const属性,那么需要加上修饰符mutable。
基本用法
现在通过三个简单的例子来介绍lambda表达式的用法,加深对其的理解。
第一个例子是函数没有返回值的形式,首先定义四个变量,然后创建lambda表达式ret, 内部直接打印父作用域四个变量的值,注意[=] 表示值传递方式捕捉所有父作用域的对象。
运行程序输出的结果如下,调用lambda表示式ret()之后,正确的输出了父作用域的所有的值。
第二个例子是增加函数的返回值,先计算父作用域所有变量的和,作为返回值。
从运行的结果看,调用匿名函数ret_02(), 正确返回了所有父作用域变量值的和
第三个例子是lambda表达式修改父作用域的值,如果想要修改父作用域的值,那么需要通过引用传递的方式。
通过引用传递的方式,将父作用域的变量i_b传递给lambda表达式的捕捉列表, 从输出的结果看,父作用域的值被修改了。
注意,捕捉列表支持传递多个值,各个值之间是通过逗号隔开。
应用场景
上面只是简单介绍了lambda表达式的使用,接下来将讲解lambda表达式的五种应用场景。
第一种场景是查找功能,首先创建list列表来存储数据,构建的数据内容如下。
接着调用find_if函数来查找项目,判断逻辑则是通过lambda表达式来实现。这里为了简化,将i_fault_id声明为局部变量,其实,可以把以下功能使用函数来封装,然后i_fault_id作为参数传递。
第二种场景是打印功能,调用for_each来循环访问向量,lambda表达式作为第三个参数,功能是打印输出向量值。
第三个场景是线程等待,创建启动线程,线程的功能是使用条件变量等待,判断条件使用lambda表达式来实现,如果队列为空,那么返回false, 条件变量继续等待,如果队列不为空,那么继续往下执行。
第四种场景作为函数的入参,首先定义函数TestCallback,入参为函数对象。
接着创建创建lambda表达式callback_handler,将其作为参数传递给上面实现的函数TestCallback。这里运用到开闭原则,TestCallback只接收参数并执行,具体执行什么内容则由外部传递进来的lambda表达式决定。
第五种场景删除功能,std::remove_if支持三个参数,前两个表示迭代器的起始和结束位置,第三个参数传递的是一个回调函数,如果回调函数返回真,那么表示应该移除。这里回调函数使用了lambda表达式。注意remove_if不会真正删除元素,它将不需要移除的元素依次替换掉序列中前面的元素,并返回应移除的第一个元素的迭代器。
如下图的例子中,std::remove_if执行完成之后,输出的值是5 6 7 4 5 6 7,即 5 6 7是不需要删除的元素,将其移到1 2 3的位置,并且返回应移除的第一个元素的迭代器,即4的位置。最后使用erase删除元素,你会发现输出的值是5 6 7。
总结
从上面介绍的lambda表达式的三种用法和五种应用场景看,可能会发现,如果不了解lambda表达式的语法,会觉得深奥难懂,但是梳理清楚之后,将会发现它其实不难,并且能够使得代码简洁易读。
- 上一篇: C++一个关于delete的幼稚错误
- 下一篇: 2021 秋招 100 道 C++ 面试高频题汇总
猜你喜欢
- 2024-12-06 2024年C++编程不再推荐使用的功能你还在在用吗?
- 2024-12-06 C++ memcpy的用法,大数据传输与获取
- 2024-12-06 C++中继承的详细介绍以及多态的使用场景
- 2024-12-06 C++“智能指针”并不智能,因为它也不总是知道内存是如何分配的
- 2024-12-06 C++11精要学习:右值引用与完美转发
- 2024-12-06 C/C++编程笔记:详细讲解丨复制构造函数
- 2024-12-06 C++ map用法总结
- 2024-12-06 C#与C++交互开发系列(四):使用C++/CLI进行互操作
- 2024-12-06 C++的map用法
- 2024-12-06 C++基础语法梳理:内存分配和管理
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)