【lambda函数】lambda()函数

news2024/9/24 19:19:28

lambda()

  • lambda()语法
    • 捕捉列表
      • mutable
    • lambda 底层原理
      • 函数对象与lambda表达式

lambda()语法

lambda表达式书写格式:

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

咱们一个个来解释:
[capture-list] :捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据 [] 来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。不能省略

(parameters): 参数列表,与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略

mutable: 默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。

-> return-type:返回值类型,用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。

statement:函数体,在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。不可省略

因此,把可以省略的都省略掉,最那简单的lambda函数是 []{} ,该 lambda 表达式没有任何意义。该lambda函数不能做任何事情。

接下来写一个lambda函数:

auto add = [](int x, int y)->int
    {
        return x + y;
    };

lambda表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可借助auto将其赋值给一个变量。
调用:

	//第一种
    add(10, 20);
    //第二种
    [](int x, int y)->int {return x + y;}(10, 20);
	

可以看出,lambda函数和普通函数在组成和调用上都很相似。参数列表,返回值,函数体都不在多叙述。

捕捉列表

捕捉列表描述了上下文中那些数据可以被lambda使用。

如:

    int a = 10;
    int b = 20;

    auto add = [a,b]() 
    {
        return a + b ;
    };

直接捕捉了 a b 变量,且是传值捕捉,lambda函数体内的a, b变量,只是外边 a b 的一份拷贝。且默认无法修改。
在这里插入图片描述
要想修改,可以使用 mutable 进行修饰。

mutable

如:

auto add = [a, b]() mutable
    {
        a = 20;
        return a + b;
    };

在这里插入图片描述

就不会报错,但因为是传值,所以lambda 函数内部 a的变化,无法影响外部的a变量。

mutable 用的比较少。

当然,lambda函数 和普通函数一样,捕捉列表,可以传值捕捉,也可以传引用捕捉。

    int x = 10;
	int y = 20;
	//捕捉列表

	//传引用   参数列表
	auto fun1 = [](int& x, int& y) {
		int tmp = x;
		x = y;
		y = x;
	};
	
    // 传引用捕捉   
	auto fun2 = [&x,&y]() {
		int tmp = x;
		x = y;
		y = x;
	};
	
    //对上下文所有变量进行传引用捕捉
	auto fun3 = [&]() {
		x = y;
	};
	
	//对除y以外的所有变量传引用捕捉,y传值捕捉
	auto fun4 = [&, y] {
		;
	};
	
    //对y进行传值捕捉,对其余变量进行传引用捕捉
	auto fun5 = [=, &y] {
		;
	};

lambda 底层原理

看如下代码:

int main()
{
    int a = 10;
    int b = 20;

    auto add = [a, b]() mutable
    {
        a = 20;
        return a + b;
    };

    cout << typeid(add).name() << endl;
    cout << sizeof(add) << endl;
	return 0;
}

lambda 函数的类型变量是什么呢?
lambda 类型的大小又是多少呢?

在这里插入图片描述

从运行结果上来看,其大小为一,类型大致为一个类,具体是什么我们现在也不清楚。

函数对象与lambda表达式

函数对象,又称为仿函数,即可以想函数一样使用的对象,就是在类中重载了operator()运算符的类对象。

//仿函数
class math {
public:
    int operator() (int x, int y)
    {
        return x + y;
    }
};

int main()
{
    int a = 10;
    int b = 20;
    //仿函数对象
    math m;
    //lambda函数
    auto add = [](int a,int b) 
    {
        return a + b;
    };
    
    m(a, b);
    add(a, b);
	return 0;
}

我们从反汇编上来看,
仿函数底层代码,调用了 重载的 ()
在这里插入图片描述

lambda() 函数的底层:
在这里插入图片描述
我们也可以看出,也是调用了一个lambda 类里的重载的()

不妨看出,lambda()函数的底层就是一个重载了()的空类。

所以就可以知道,lambda类型的大小为1了:

因为,它的底层是一个空类,是一个仿函数。

至于它的类型,如图:
在这里插入图片描述

也就是,上图是 lambda_UUID
UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是通过一种特殊的算法计算出来的具有唯一识别信息的 数据。

也就是说,每一个lambda()对象的类型都不一样。
也就不存在不同lambda()对象相互赋值的情况。

结语
本次的博客就到这了。

我是Tom-猫,
如果觉得有帮助的话,记得
一键三连哦ヾ(≧▽≦*)o。

咱们下期再见。

在这里插入图片描述

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

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

相关文章

【数据结构】排序:插入排序与希尔排序详解

本章开始就要分享一些常用的排序方法&#xff0c;我们的日常生活中很多地方都要使用排序&#xff0c;比如电商平台可以按照你的需求进行排序&#xff0c;或者是你想了解大学的综合排名时 我们之前也学到过一些简单的排序比如冒泡排序&#xff0c;虽然他在时间复杂度上可以说是依…

归并排序(思路+代码)

变量&#xff1a; left、right、privot、temp[]、leftIndex、k 思路&#xff1a; 代码&#xff1a; import java.util.Arrays;public class Queue8 {public static void main(String[] args) {int[] arr {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};sort(arr,0,arr.length-1);System.ou…

AST-抽象语法树

js加密解混淆首先想到的是AST语法树&#xff0c;那么什么是AST呢&#xff0c;学习AST过程的一些笔记 1.AST是JS执行的第一步是读取 js 文件中的字符流&#xff0c;然后通过词法分析生成令牌流Tokens&#xff0c;之后再通过语法分析生成 AST&#xff08;Abstract Syntax Tree&a…

3D 旋转木马

在工作中我们常用到3D装换和3D位移 主要知识点 3D位移&#xff1a;transale3d(x,y,z)3D旋转&#xff1a;rotate3d(x,y,z)透视&#xff1a;perspective3D呈现 transfrom-style 1、 transale3d translform: translform:translateX(100px):仅仅是在x轴上移动translform:transl…

[NOI2014] 随机数生成器(模拟+贪心)

题面 [NOI2014] 随机数生成器 - 洛谷 题解 缝合题 第一部分&#xff0c;直接模拟题目操作生成二维数组即可&#xff0c;复杂度O(n*mQ) 第二部分&#xff0c;是一个比较经典的字典序贪心 首先肯定需要将最小的数放到路径上&#xff0c;这样可选的剩下的数就被限制在了最小数…

Redis 管道

问题由来&#xff1a;如何优化频繁命令往返造成的性能瓶颈&#xff1f; Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。 一个请求会遵循以下步骤&#xff1a; 1、客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果)&#xff0c;并监听S…

Codeforces Round 883 (Div. 3) A~G

比赛链接&#xff1a;Dashboard - Codeforces Round 883 (Div. 3) - Codeforces 目录 A. Rudolph and Cut the Rope B. Rudolph and Tic-Tac-Toe C. Rudolf and the Another Competition D. Rudolph and Christmas Tree E. Rudolf and Snowflakes F. Rudolph and Mimic…

JavaWeb项目(包含SSM项目)部署到Linux云服务器

目录 一、云服务器环境部署 1、安装JDK 查看JDK的命令为&#xff1a; 安装JDK命令&#xff1a; 2、安装Tomcat 2.1 安装步骤 2.2 验证Tomcat是否启动成功 3、安装MySQL 二、部署 Web 项目到 Linux 2.1 在云服务器中数据库建库建表 2.2 修改部署项目连接数据库密码 …

Qt(Day2)

实现登录框中&#xff0c;当登录成功时&#xff0c;关闭登录界面&#xff0c;并跳转到其他界面&#xff1a;

Go实现在线词典翻译(三种翻译接口,结合sync)

火山翻译 首先介绍用火山翻译英译汉。 package mainimport ("bufio""bytes""encoding/json""fmt""io""log""net/http""os""strings""unicode" )type DictRequestHS st…

第四章:角色和菜单管理功能【基于Servlet+JSP的图书管理系统】

角色和菜单功能 一、角色功能 接下来我们可以完成角色管理的增删改查操作 1. Bean对象 创建sys_role对应的实体对象SysRole Data public class SysRole {private Integer id;private String name;private String notes;private Date createTime; }2. Dao层 现在我们就可以在D…

JVM(Java虚拟机)详解

目录 一、JVM内存区域划分 1. 什么是内存区域划分以及为啥要进行区域划分 2. JVM内存区域划分详解 3. 堆区详解&#xff1a; 4. 给一段代码&#xff0c;问某个变量是在那个区域上&#xff1f; 二、JVM类加载机制 1.类加载的过程 2. 类加载的时机 3. 双亲委派模型&#xff08…

下班前几分钟,我彻底玩懂了tmux

目录 1. tmux简介2. Session3. Window4. Pane5. 自定义tmux配置6. 在shell脚本中操纵tmuxReferences 1. tmux简介 tmux&#xff08;terminal multiplexer&#xff09;是一个非常强大的工具&#xff0c;主要有以下几点功能&#xff1a; 终端复用&#xff1a; tmux 使你能够在一…

Linux分布式应用 Zabbix监控配置[添加主机 自定义监控内容 邮件报警 自动发现/注册 代理服务器 高可用集群]

-------------------- 添加 zabbix 客户端主机 -------------------- 关闭防火墙 systemctl disable --now firewalld setenforce 0 hostnamectl set-hostname zbx-agent01 服务端和客户端都配置时间同步 yum install -y ntpdate ntpdate -u ntp.aliyun.com 服务端和客户端都设…

基于simulink跟踪火车站对象检测遗弃物体(附源码)

一、前言 此示例演示如何跟踪火车站的对象并确定哪些对象保持静止。公共场所的遗弃物品会引起当局的关注&#xff0c;因为它们可能会构成安全风险。算法&#xff08;例如本例中使用的算法&#xff09;可用于通过将他们的注意力引导到潜在的感兴趣区域来协助监控实时监控视频的…

二十五、传输层协议(上)

文章目录 一、再谈端口号&#xff08;一&#xff09;端口号定义&#xff08;二&#xff09;端口号范围划分1.一共有 2^16 个端口2.认识知名端口号(Well-Know Port Number)3.端口号和进程就是K-V关系4.netstat&#xff08;1&#xff09;示例1&#xff1a; n 拒绝显示别名&#x…

CentOS Linux上安装JDK11、MySQL8.0、Minio等软件(rpm脚本模式)

本地环境&#xff1a;Windows 10家庭版 16G内存 512G硬盘 软件&#xff1a;VMWare WorkStation 16.0 FinalShell 4.0.1 一、下载必要软件包 下载软件均选择x86架构64位&#xff01;&#xff01;&#xff01;&#xff08;可根据自己的电脑配置选择&#xff09; CentOS Linu…

基础算法-前缀和

1 算法笔记 2.代码示例 3.代码解析 #include<iostream> using namespace std; const int maxn 1010000; int a[maxn],s[maxn];//a数组是用来存放数组的&#xff0c;s是用来存放前n项数组的和 int m,n;int main(){scanf("%d%d",&n,&m);for(int i1;i&l…

【react】插件react-tsparticles和tsparticles实现粒子特效:

文章目录 一、效果图:二、实现思路:三、实现代码:【1】安装依赖【2】 一、效果图: 二、实现思路: particles&#xff08;npm i react-particles-js&#xff09;目前已被弃用&#xff1b;取代它的是tsparticles&#xff08;npm i react-tsparticles 和npm install tsparticles&a…