C++ :lambda表达式

目录

lambda表达式书写格式:

lambda表达式各部分说明:

lambda的使用示范:

注意事项: 

 返回值类型可以省略,参数也可也省略:

sort内部也可以直接写lambda表达式: 

排序时利用lambda进行排序: 

lambda的类型:

捕捉列表的使用方式 和 mutable为什么省略 ?  

lambda的特殊使用方式: 

混合捕捉: 


lambda表达式书写格式:

[capture-list] (parameters) mutable -> return-type { statement }

lambda表达式各部分说明:

  • [capture-list] : 捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来 判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda 函数使用。
  • (parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以 连同()一起省略
  • mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量 性。使用该修饰符时,参数列表不可省略(即使参数为空)。 
  • ->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回 值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推 导。
  • {statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获 到的变量。

注意:在lambda函数定义中,参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为 空。因此C++11中最简单的lambda函数为:[]{}; 该lambda函数不能做任何事情。 

根据lambda的表达式,可以看出 lambda的本质是一个匿名函数,其次捕捉列表虽然可以为空,但是不能被省略,而mutable在默认的情况下可以省略,只有在特殊的情况下才进行使用

lambda的使用示范:

注意事项: 

 返回值类型可以省略,参数也可也省略:

返回值在明确的时候可以省略!因为编译器它会自动推导!同样参数也可以省略!前提是没有参数!

sort内部也可以直接写lambda表达式: 

排序时利用lambda进行排序: 

lambda的类型:

 每一个lambda表达式都是不一样的,可以看到下图中的lambda后面跟随着的一串数字乱码都是不固定的。

 其次,lambda的本质是一个仿函数,是因为lambda的底层或是说它的内部会更具lambda的内容生成对应的仿函数,不过是类似于仿函数,因为调用lambda本质上是调用operator()

捕捉列表的使用方式 和 mutable为什么省略 ?  

如上图所示,捕捉列表[]内部并没有任何的参数,反而是参数列表中进行了传址调用,这里使得lambda是变成了一个匿名函数,而如果想只捕捉变量 a 和 b 则需要将ab放入捕捉列表中,参数列表变为空即可,但是把a和b放入捕捉列表又会出现一些小问题:

 因为捕捉的变量是拷贝,而不是直接进行传址拷贝的,而是传值拷贝的,同时捕获的变量是被const修饰的,也就是捕获列表的a,b是不可修改的,所以这里就需要mutable 

 

但是还是没有什么意义,应为把捕获的a,b变得可以修改数值,但是捕获的a,b和外面变量a,b不是同一个a,b,所以没有意义,因为捕获列表的捕获是传值拷贝,不是传址拷贝,所以这样使用mutable和这样写法的捕获列表是无效的,没有意义的。

如果想要同时修改外面的变量,可以使用&进行引用捕获:

但是&是引用和取地址在这里会出问题,容易弄混,这下面是引用方式捕捉:

 同时也可以使用传指针的方式进行交换来改变外面的变量

lambda的特殊使用方式: 

 [=]传值捕捉所有,[&]传引用捕捉所有,前者是传值调用,捕获所有变量的数值,后者是引用调用,捕获所有的变量并且进行引用

混合捕捉: 


 

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

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

相关文章

STM32MP135裸机编程:使用软件触发硬件复位

0 参考资料 STM32MP13xx参考手册.pdf 1 使用寄存器实现软件复位 1.1 复位电路概述 重点关注下面标红的路线: 通过这条路线可以清楚看到,我们可以通过设置RCC_MP_GRSTCSETR寄存器让RPCTL(复位脉冲控制器)给NRST(硬件复…

苹果可能与谷歌合作推AI订阅服务;全国首个司法审判大模型在深圳上线

🦉 AI新闻 🚀 苹果可能与谷歌合作推AI订阅服务 摘要:苹果宣布将与OpenAI合作推出Apple Intelligence,并有望在今年秋季与谷歌达成合作,接入Gemini。Meta的Llama因质量不佳被拒。苹果计划推出订阅模式的智能功能服务&…

Oracle PL / SQL 存储过程

PL / SQL存储过程不返回值。他们执行他们的指示并返回。您不能在赋值语句(如函数)的右侧使用存储过程。 创建存储过程 以下代码是一个非常简单的存储过程示例。 它基于SYS.DBMS_LOCK包的程序sleep(数量)。 此存储过程将停止执行…

在 C++的跨平台开发中,如何处理不同操作系统和编译器之间的细微差异,以确保程序能够稳定且高效地运行?

在 C 的跨平台开发中,处理不同操作系统和编译器之间的细微差异是非常重要的。以下是一些处理差异的技巧: 使用条件编译:使用预处理指令,根据不同的操作系统和编译器来编写不同的代码。 #if defined(_WIN32)// Windows 特定代码 …

kafka的工作原理与常见问题

定义 kafka是一个分布式的基于发布/订阅模式的消息队列(message queue),主要应用于大数据的实时处理领域 消息队列工作原理 kafka的组成结构 kafka的基础架构主要有broker、生产者、消费者组构成,还包括zookeeper. 生产者负责发送…

算法09 日期相关模拟算法【C++实现】

这是《C算法宝典》算法篇的第09节文章啦~ 如果你之前没有太多C基础,请点击👉专栏:C语法入门,如果你C语法基础已经炉火纯青,则可以进阶算法👉专栏:算法知识和数据结构👉专栏&#xff…

计算斜率,判断斜率

#include <stdio.h> #include <stdlib.h> #include <math.h> #include <stdbool.h>// 定义常量 #define LOW_COOK_WINDOW_SIZE 20 // 滑动窗口大小&#xff0c;10个样本点&#xff08;10秒&#xff09; #define LOW_COOK_SLOPE…

Java代码生成器(开源版本)

一、在线地址 Java在线代码生成器&#xff1a;在线访问 二、页面截图 三、核心功能 支持Mybatis、MybatisPlus、Jpa代码生成使用 antlr4 解析SQL语句&#xff0c;保证了SQL解析的成功率支持自定义包名、作者名信息支持自定义方法名、接口地址支持自定义选择是否生成某个方法…

16-Python Pandas聚合函数

Python Pandas聚合函数 窗口函数可以与聚合函数一起使用&#xff0c;聚合函数指的是对一组数据求总和、最大值、最小值以及平均值的操作。 应用聚合函数 首先让我们创建一个 DataFrame 对象&#xff0c;然后对聚合函数进行应用。 import pandas as pd import numpy as np d…

SQL中的子查询和CTE(with ....as..)

第一次看到with as 这种类似于python中读文件的写法还是挺疑惑的&#xff0c;其实它是CTE&#xff0c;功能和子查询很类似但又有不同点&#xff0c;在实际应用场景中具有着独特作用。 子查询 子查询是在主查询中的嵌套查询&#xff0c;可以出现在SELECT、FROM、WHERE等子句中…

ai除安卓手机版APP软件一键操作自动渲染去擦消稀缺资源下载

安卓手机版&#xff1a;点击下载 苹果手机版&#xff1a;点击下载 电脑版&#xff08;支持Mac和Windows&#xff09;&#xff1a;点击下载 一款全新的AI除安卓手机版APP&#xff0c;一键操作&#xff0c;轻松实现自动渲染和去擦消效果&#xff0c;稀缺资源下载 1、一键操作&…

数学建模(1):期末大乱炖

1 概述&#xff01;&#xff01; 1.1 原型和模型 原型&#xff1a;客观存在的研究对象称为原型&#xff0c;也称为“系统”、“过程”。 机械系统、电力系统、化学反应过程、生产销售过程等都是原型&#xff1b; 研究原型的结构和原理&#xff0c; 从而进行优化、预测、评价…

Perl编程艺术:深入探索Tie机制的魔力

&#x1f31f; Perl编程艺术&#xff1a;深入探索Tie机制的魔力 在Perl的世界里&#xff0c;tie功能是一种极其强大的特性&#xff0c;它允许程序员将变量绑定到一个对象上&#xff0c;从而改变这个变量的默认行为。这种机制为变量提供了一种代理访问方式&#xff0c;使得变量…

Jedis、Lettuce、RedisTemplate连接中间件

jedis就像jdbc一样&#xff0c;用于两个端直接的连接。 1.创建Spring项目 这里不过多赘述... 2.导入连接工具jedis 在pom文件中导入jedis的依赖。 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version&…

结合数据索引结构看SQL的真实执行过程

引言 关于数据库设计与优化的前几篇文章中&#xff0c;我们提到了数据库设计优化应该遵守的指导原则、数据库底层的索引组织结构、数据库的核心功能组件以及SQL的解析、编译等。这些其实都是在为SQL的优化、执行的理解打基础。 今天这篇文章&#xff0c;我们以MySQL中InnoDB存…

vim卡死

有些时候使用vim的时候莫名其妙的会卡死&#xff0c;导致输入不了内容。查了一下资料发现&#xff0c;其实并不是vim卡死&#xff0c;而是在使用vim的工程中带入了许多Windows上的使用习惯&#xff0c;比如“Ctrl-s”保存等&#xff0c;这可能会与Linux平台的有些快捷键冲突。c…

Oracle PL / SQL 表 table

关系数据库允许您在数据库管理系统&#xff08;DBMS&#xff09;中存储多个表。 您可以使用计算机上的查询语言来操作表中的数据。 当前的查询语言是结构化查询语言&#xff08;SQL&#xff09;。 SQL是一组无关的命令&#xff0c;用于操作关系数据库管理系统&#xff08;RD…

CleanMyMacX2024免费且强大的mac电脑系统优化工具

如果你的Mac电脑出现了存储空间不足、运行缓慢、电池电量消耗过快等问题&#xff0c;那么CleanMyMacX这款软件或许能为你提供解决方案。作为一款强大的系统优化工具&#xff0c;它能够帮助用户清理垃圾文件、优化内存和电池使用&#xff0c;从而提升Mac的性能表现&#xff0c;让…

后端之路第三站(Mybatis)——XML文件操作sql

一、XML映射文件是啥 前面我们学过了在Mapper接口用注解的方式来操作sql语句 那么XML映射文件就另一种操作sql语句的方法 为什么还要有这么个玩意&#xff1f; 我简单说就是&#xff1a;如果有的sql特别复杂的话&#xff0c;比如需要【动态sql】的话&#xff0c;就得用到XM…

【Android面试八股文】Fragment的add和replace的区别,分别对Fragment的生命周期有什么影响?

文章目录 一、Fragment的add和replace的区别 ,分别对Fragment的生命周期有什么影响?1.1 `add` 方法1.2 `replace` 方法1.3 应用场景1.4 Fragment事务操作提交流程1.5 replace操作的本质是不是就是remove操作和add操作的组合?1.6 示例代码:将一个已经存在的 `FragmentA` 替换…