使用Lambda表达式mutable有感

news2024/11/24 21:00:07

使用Lambda表达式mutable有感

在学Qt的时候,我看着mutable陷入了沉思,总觉得它和C++中的某个特性很像?没错,就是 深拷贝

如果你忘记了深拷贝和浅拷贝是什么,那跟着我来一起回忆一下吧。首先来看深拷贝与浅拷贝的概念


浅拷贝

浅拷贝是指在复制对象时,只复制对象本身,而不复制对象所引用的内容。这意味着,当原始对象或复制对象的引用内容发生变化时,另一个对象也会受到影响
在这里插入图片描述


深拷贝

深拷贝是指在复制对象时,不仅复制对象本身,还复制对象所引用的内容。这样,当原始对象或复制对象的引用内容发生变化时,另一个对象不会受到影响。

这与浅拷贝不同,浅拷贝只复制对象本身,而不复制对象所引用的内容

在这里插入图片描述


以下是一个简单的深拷贝与浅拷贝的示例:

#include <iostream>
using namespace std;

int main() {
    int a = 10;
    int b = a; // 深拷贝

    int *p1 = new int(20);
    int *p2 = p1; // 浅拷贝

    cout << a << endl; // 输出 10
    cout << b << endl; // 输出 10

    a = 30;
    cout << a << endl; // 输出 30
    cout << b << endl; // 输出 10

    cout << *p1 << endl; // 输出 20
    cout << *p2 << endl; // 输出 20

    *p1 = 40;
    cout << *p1 << endl; // 输出 40
    cout << *p2 << endl; // 输出 40

    delete p1;
    return 0;
}

在上面的代码中,我们首先定义了两个整数变量a和b,并使用赋值运算符将a的值赋给b。这相当于对b进行了深拷贝,因为它创建了一个新的整数变量,并将a的值复制到了新变量中

接下来,我们使用new运算符在堆内存中分配了一个整数,并将其初始化为20。然后,我们定义了两个指针变量p1和p2,并使用赋值运算符将p1的值赋给p2。这相当于对p2进行了浅拷贝,因为它只复制了指针本身,而不复制指针所指向的内容

细心的同学可能会发现我给出的示例其实是不严谨的,深拷贝和浅拷贝通常用于描述复制对象时的行为(特别是当对象包含指针或引用类型的成员时)。在我给出的简单示例中,我使用了基本类型的变量(即整数变量)来演示深拷贝和浅拷贝的概念。这样做是为了简化示例,让大家更好地理解深拷贝和浅拷贝的区别


Mutable 关键字

默认情况下,Lambda 表达式不能修改以值方式捕获的外部变量。如果您想要在 Lambda 表达式中修改这些变量,那么您需要在参数列表后面添加 mutable 关键字

#include <iostream>

int main()
{
	int x = 0;

	auto increment = [x]()mutable {
		x++;
		std::cout << "x in lambda: " << x << std::endl;
	};

	increment();
	increment();

	std::cout << "x in main: " << x << std::endl;

	return 0;
}

输出的结果为:

x in lambda: 1
x in lambda: 2
x in main: 0

从输出的结果上看,mutable关键字的copy机制和深拷贝非常相像,但我可以很明确的告诉你,mutable的copy机制不属于深拷贝

有同学会疑惑?为什么不属于深拷贝?这个机制不是一模一样的吗?

  1. mutable关键字确实会为被捕获的变量创建一个副本,并且修改这个副本不会影响外部的变量。但mutable不是为整个对象创建了一个新的副本。因此,它并不是深拷贝
  2. 深拷贝通常指的是对于一个对象,它的拷贝构造函数或赋值运算符重载函数会创建一个新的对象,并且复制原对象的所有数据,包括指针成员指向的内存

你可以这么理解,捕获和深拷贝都会创建一个副本,但是它们的目的和范围不同。捕获是针对单个变量而言的,它会创建一个被捕获变量的副本。而深拷贝是针对整个对象而言的,它会创建一个新的对象,并复制原对象的所有数据。这两种方式都不会影响被拷贝的变量或对象的值

机制很像,但是在mutable关键字中叫捕获,而不是拷贝

参考资料

1. StackOverFlow | What is the difference between a deep copy and a shallow copy?
2. C++ 中的 mutable 关键字

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

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

相关文章

从零开始学习Linux运维,成为IT领域翘楚(四)

文章目录 &#x1f525;Linux路径&#x1f525;Linux处理文件目录的常用命令&#x1f525;Linux文件编辑工具vi/vim&#x1f525;Linux文件内容查看命令 &#x1f525;Linux路径 路径&#xff0c;顾名思议&#xff0c;是指从树形目录中的某个目录层次到某个文件的一条道路。 Li…

设计模式-工厂、装饰模式

一. 设计模式-工厂模式 package com.factory.pattern;/**目标&#xff1a;工厂模式。什么是工厂设计模式&#xff1f;工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的方…

Spring 5 笔记 - AOP

1. AOP 简介 AOP&#xff1a;Aspect Oriented Programming&#xff0c; 面向切面编程或面向方面编程。利用AOP可以对业务逻辑的各个部分进行隔离&#xff0c;从而使得业务逻辑各部分之间的耦合度降低&#xff0c;提高程序的可重用性&#xff0c;同时提高了开发的效率。 将日志…

【英语】大学英语CET考试,写作部分(论述文+应用文,6篇范文)

文章目录 3项评分标准&#xff08;内容&结构&#xff0c;语言&#xff09;0.1 论述文个人小结 1、论述文&#xff1a;审题与功能句2、论述文&#xff1a;修饰内容和名言模板3、论述文&#xff1a;现象作文&利弊分析4、论述文&#xff1a;给出权威论据和有侧重的现象5、…

新老stp的配置和安全总结部分

老stp只有根桥没有备份桥 老stp的五种接口状态&#xff1a; disable 接口down没开stp blocking 阻塞 listening 发bpdu&#xff0c;比较bpdu优劣 leraning 开始学习mac地址表 forwardding 转发 老stp直接拓扑变化30秒&#xff0c;间接拓扑变化50秒 RSTP只有3种端口状态&#…

每日学术速递4.28

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.StepFormer: Self-supervised Step Discovery and Localization in Instructional Videos(CVPR 2023) 标题&#xff1a;StepFormer&#xff1a;教学视频中的自我监督步骤发现和定位…

vue diff算法与虚拟dom知识整理(1) 概念叙述

今天开始 我们来学习 虚拟dom和diff算法 首先 我们要简单了解 虚拟dom和diff算法在vue中的作用 例如 下图左侧是我们的加 然后 我们要将 家按图右改造一下 我们先来找一下不同 如图卷出来的效果 我们起居室想多装一个沙发 卧室床改了位置 电视不要了 阳台小改了一下 其实改…

每日学术速递4.27

Subjects: cs.CV 1.End-to-End Spatio-Temporal Action Localisation with Video Transformers 标题&#xff1a;使用视频转换器进行端到端时空动作定位 作者&#xff1a;Alexey Gritsenko, Xuehan Xiong, Josip Djolonga, Mostafa Dehghani, Chen Sun, Mario Lučić, Corde…

IS-IS协议基础知识

文章目录 前言介绍地址格式报文格式区域及路由器类型区域类型路由器类型Level-1 路由器Level-2 路由器Level-1-2路由器 IS-IS 网络类型DIS及伪节点伪节点DIS与OSPF的DR/BDR不同之处 IS-IS 邻接关系握手报文邻接关系的建立 IS-IS 链路状态数据库概述数据库同步报文泛洪机制数据库…

【网络编程】socket套接字

文章目录 一、源IP和目的IP二、端口号port三、TCP/UDP协议3.1 网络字节流 四、socket套接字4.1 socket常见接口4.2 sockaddr结构体 五、总结 一、源IP和目的IP 如果我们的台式机或者笔记本没有IP地址就无法上网&#xff0c;而因为每台主机都有IP地址&#xff0c;所以注定了数据…

Prometheus Exporter开发

Prometheus Exporter开发 Exporter数据格式介绍 Exporter徒手开发 Exporter4种指标类型演示 Exporter自定义注册表 Exporter 基于Collector的模块开发 Exporter介绍 数据格式 通讯协议 HTTP协议服务端实现了gzip 数据格式 text/plain:文本协议 数据格式 prometheus…

MySQL性能监控全掌握,快来get关键指标及采集方法!

数据库中间件监控实战&#xff0c;MySQL中哪些指标比较关键以及如何采集这些指标了。帮助提早发现问题&#xff0c;提升数据库可用性。 1 整体思路 监控哪类指标&#xff1f; 如何采集数据&#xff1f; 第10讲监控方法论如何落地&#xff1f; 这些就可以在MySQL中应用起来。…

ChatGPT提示词工程(四):Inferring推断

目录 一、说明二、安装环境三、推断&#xff08;Inferring&#xff09;1. 推断情绪&#xff08;正面 / 负面&#xff09;2. 确定情绪的类型3. 识别愤怒4. 从客户评论中提取产品和公司名称5. 一次完成多项任务6. 推断主题7. 主题中是否包含给定的主题 一、说明 这是吴恩达 《Ch…

【栈】的实现

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : 数据结构 &#x1f606;今日分享 : —>&#x1f4d6;区块链 &#xff1a; 小明向你借100块钱&#xff0c;说一周后还你&#xff0c;然后你拿个喇叭大喊一声&#xff1a;我是某某&#xff0c;小明向我借了100块&#xff0c…

Redis缓存(双写一致性问题)

Redis缓存&#xff08;双写一致性问题&#xff09; 1 什么是缓存?1.1 为什么要使用缓存1.2 如何使用缓存 2 添加缓存2.1 、缓存模型和思路2.2、代码如下 3 缓存更新策略3.1 、数据库缓存不一致解决方案&#xff1a;3.2 、数据库和缓存不一致采用什么方案 4 实现商铺和缓存与数…

【C生万物】 指针篇 (初级)

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《C生万物 | 先来学C》&#x1f448; 前言&#xff1a; 面对C语言&#xff0c;很多童鞋都会高呼&#xff1a;指针难&#xff0c;指针难&#x…

【计算机专业漫谈】【计算机系统基础学习笔记】W2-1十进制数与二进制数,各进制数直接的转换

利用空档期时间学习一下计算机系统基础&#xff0c;以前对这些知识只停留在应试层面&#xff0c;今天终于能详细理解一下了。参考课程为南京大学袁春风老师的计算机系统基础MOOC&#xff0c;参考书籍也是袁老师的教材&#xff0c;这是我的听课自查资料整理后的笔记 W2-1十进制…

ChatGPT背后的技术:人类反馈强化学习RLHF

文章目录 前言Chat GPT是如何基于RLHF进行训练的RLHF 技术分解预训练语言模型训练奖励模型强化学习微调预训练模型 局限性参考 前言 随着OpenAI推出的Chat GPT火热出圈&#xff0c;Chat GPT背后的技术原理之一&#xff0c;人类反馈强化学习RLHF (Reinforcement Learning from …

Matplotlib 网格线

我们可以使用 pyplot 中的 grid() 方法来设置图表中的网格线。 grid() 方法语法格式如下&#xff1a; matplotlib.pyplot.grid(bNone, whichmajor, axisboth, ) 参数说明&#xff1a; b&#xff1a;可选&#xff0c;默认为 None&#xff0c;可以设置布尔值&#xff0c;true…

prometheus实战之二:使用常见指标

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《prometheus实战》系列的第二篇&#xff0c;在《prometheus实战之一&#xff1a;用ansible部署》一文咱们部署了prometheus服务&#xff0c…