当前位置: 首页 > news >正文

λ表达式、智能指针

lambda 表达式

1、C++11标准支持,实现匿名函数的功能;
2、通常用于实现轻量级的函数

格式

mutable->返回值{函数体}; // 返回值即使是 void 也必须得写
[] 内,可以填外部数据;
() 内,可以带有参数列表。

lambda 表达式的结果,通常使用 auto 获取:
auto p = mutable->返回值{函数体};
等价于:返回值 (*p)(参数列表) = mutable->返回值{函数体};

[]()->返回值{函数体};				// mutable 可省略
[]:			捕获列表,可以捕获所有的外部变量
[a,b]:		按值捕获外部变量 a 和 b,不加 mutable 关键字则不能修改变量
[&a,&b]:	按引用捕获外部变量 a 和 b,即使不加 mutable 也能正常修改变量
[=]:		按值捕获所有的外部变量
[&]:		按引用捕获所有的外部变量
[=,&a]:		按值捕获除了 a 之外的所有外部变量,对 a 进行按引用捕获
[&,a]:		按引用捕获除了 a 外的所有外部变量,对 a 进行按值捕获

使用

// e.g. #include <iostream>
using namespace std;int main()
{int a1 = 90, b1 = 70;double c = 7;// 返回值类型  参数类型auto p = [&a1, b1](int a, int b)mutable->int{a1 = 80;return b;};cout << p(2, 3) << endl;cout << a1 << endl;return 0;
}

在这里插入图片描述

💡 练习

使用 lambda 表达式,求两数中的最大值,要求:通过参数传递,不能写复杂的运算。

#include <iostream>
using namespace std;/* ---------- 方法一:---------- */
int main()
{int a = 15;int b = 7;auto p = [ ](int num1, int num2)mutable->int{return num1 > num2 ? num1 : num2;};cout << p(a, b) << endl;return 0;
}/* ---------- 方法二:---------- */
int main()
{int a = 15;int b = 7;auto p = [a, b]()mutable->void{cout << (a > b ? a : b) << endl;};p();return 0;
}

智能指针

堆内存的对象需要手动 delete 销毁,如果忘记使用 delete 销毁就会造成内存泄漏。
所以 C++ 在 ISO 98 标准中引入了智能指针的概念,并在 C++11 中趋于完善。
智能指针是 C++ 中的一种特殊类型,用于管理动态分配的内存。它可以自动释放内存,避免了手动管理内存的繁琐和可能的内存泄漏。需要导入头文件:#include <memory>
智能指针指向的堆空间,无需手动 delete
使用智能指针可以让堆内存对象具有栈内存对象的特性,原理是给需要自动回收的堆内存对象套上了一个栈内存的模板对象。

auto_ptr

已经被放弃使用了,但依然可以使用。
(C++98 标准还在使用,后面就弃用了,在复制语义时,会转让空间所有权

#include <iostream>
#include <memory>
using namespace std;class A
{
public:A()  {cout << "A的构造函数" << endl;}~A() {cout << "A的析构函数" << endl;}
};int main()
{A *pnew = new A;// exit(0);                     // 退出程序,即使使用智能指针也不会释放空间auto_ptr<A> p1(pnew);           // 使用原始指针作为参数调用 auto_ptr 的构造函数auto_ptr<A> p2(p1);             // p1 把堆空间的所有权,转让给 p2// auto_ptr会在复制指针时,把原来指针对空间的所有权,转让给另一个指针cout << p1.get() << endl;       // 智能指针不是一个原始指针,不能直接输出cout << p2.get() << endl;		// 要使用 get 函数获取原始指针类型的地址// p2.release();				// 释放 p2 智能指针 对 pnew 的控制权p2.reset();						// 释放控制权且销毁资源对象return 0;
}

在这里插入图片描述

unique_ptr(独占指针)

unique_ptr 是一种独占所有权的智能指针,它不能被复制或共享。当 unique_ptr 被销毁时,它所管理的对象也会自动被释放。

#include <iostream>
#include <memory>
using namespace std;class A
{
public:A()  {cout << "A的构造函数" << endl;}~A() {cout << "A的析构函数" << endl;}
};int main()
{// 1、使用已有的裸指针 p,初始化 unique_ptr// 可以申请独占指针成功,但是裸指针和独占指针都指向同一片堆空间,// 独占指针失去了对空间的唯一所有权,不建议使用A *p = new A;unique_ptr<A> p1(p);cout << p << endl;  			// 地址 0cout << p1.get() << endl;  		// 地址 1,地址1 == 地址0// unique_ptr<A> p2(p1);  		// 没有拷贝构造函数,不能拷贝// 2、使用 new 关键字,给独占指针申请空间unique_ptr<A> p2(new A);cout << p2.get() << endl;		// 地址 2// 3、使用函数,给 unique_ptr 分配空间,C++ 14 支持 make_unqieunique_ptr<A> p3 = make_unique<A>();  // make_unique 调用构造函数,使用赋值的方式// move 转让空间的使用权unique_ptr<A> p4(move(p2));cout << p2.get() << endl;		// 输出 0cout << p4.get() << endl;		// 输出 地址2return 0;
}

在这里插入图片描述
在这里插入图片描述

#include <memory>int main() {std::unique_ptr<int> myPtr(new int(10));// 使用 myPtr 操作动态分配的内存// 当 myPtr 超出作用域时,内存会自动释放return 0;
}

shared_ptr(共享指针 / 计数指针)

shared_ptr 是一种带有引用计数的智能指针,多个 shared_ptr 可以共享同一个对象。当没有任何 shared_ptr 指向它时,对象会被销毁。

#include <iostream>
#include <memory>
using namespace std;class A
{
public:A()  {cout << "A的构造函数" << endl;}~A() {cout << "A的析构函数" << endl;}
};
int main()
{// 1、通过裸指针,创建共享指针A *p = new A;shared_ptr<A> p1(p);shared_ptr<A> p2(p1);cout << p1.get() << endl;		// 地址 1cout << p2.get() << endl;		// 地址 2,地址2 == 地址1// 2、通过 new 创建共享指针shared_ptr<A> p3(new A);shared_ptr<A> p4(p3);  			// p3 和 p4 指向同一片空间shared_ptr<A> p5(p4);cout << p3.get() << endl;cout << p4.get() << endl;cout << p5.get() << endl;		// 地址3 == 地址4 == 地址5// 直接让指针值 nullptr,会释放空间所有权// 共享指针引入计数机制 use_count()p4 = nullptr;cout << p5.use_count() << endl;p3 = nullptr;cout << p5.use_count() << endl;p5.reset();    		// 成员函数 reset,也可以释放共享指针对空间的所有权cout << p5.use_count() << endl;// 如果 use_count 的个数为0,说明没有指针指向该空间,也会释放掉堆空间cout << p5.use_count() << endl;return 0;
}

在这里插入图片描述

#include <memory>int main() {std::shared_ptr<int> ptr1(new int(10));{std::shared_ptr<int> ptr2 = ptr1; 		// 引用计数加1// 使用 ptr1 和 ptr2 操作动态分配的内存} 	// ptr2 超出作用域,引用计数减1// 当 ptr1 超出作用域时,内存会自动释放return 0;
}

weak_ptr(协助指针)

weak_ptr 是一种弱引用智能指针,它可以指向 shared_ptr 所管理的对象,但不会改变引用计数。当所有 shared_ptr 都释放后,weak_ptr 会自动失效。
weak_ptr 是一个不控制资源对象的智能指针,也不会影响资源的引用计数,其主要目的协助shared_ptr 工作。
通过 weak_ptr 的构造函数,参数传入一个持有资源对象的 shared_ptr 对象或 weak_ptr 对象即可创建。weak_ptr 与资源对象呈现弱相关性,因此不支持 get 等函数直接操作资源对象。
建议 weak_ptr 调用 lock 函数之前,先检测引用计数是否大于零,或者使用 expired() 函数检测是否可以转为 shared_ptr。

#include <memory>int main() {std::shared_ptr<int> ptr1(new int(10));std::weak_ptr<int> ptr2 = ptr1; // 弱引用{std::shared_ptr<int> ptr3 = ptr2.lock(); // 通过 weak_ptr 获取强引用if (ptr3) {// 使用 ptr3 操作动态分配的内存}} // ptr3 超出作用域,引用计数减1// 当 ptr1 超出作用域时,内存会自动释放return 0;
}

相关文章:

λ表达式、智能指针

lambda 表达式 1、C11标准支持&#xff0c;实现匿名函数的功能&#xff1b; 2、通常用于实现轻量级的函数 格式 mutable->返回值{函数体}; // 返回值即使是 void 也必须得写 [] 内&#xff0c;可以填外部数据&#xff1b; () 内&#xff0c;可以带有参数列表。 lambda 表达…...

PHP基础知识和操作

PHP在线运行 https://c.runoob.com/compile/1/ https://www.sotool.net/php80 将驼峰字符串转化为蛇形字符串 <?phpfunction CamelToSnake($camelValue) {$initValue preg_replace(/\s/u, , $camelValue);$snakeValue strtolower(preg_replace(/(.)(?[A-Z])/u, &quo…...

系列十三、SpringBoot的自动配置原理分析

一、概述 我们知道Java发展到现在功能十分的强大&#xff0c;生态异常的丰富&#xff0c;这里面离开不了Spring及其家族产品的支持&#xff0c;而作为Spring生态的明星产品Spring Boot可以说像王者一般的存在&#xff0c;那么的耀眼&#xff0c;那么的光彩夺目&#xff01;那么…...

soapui报错: CXF directory must be set in global preferences

文章目录 下载官网下载网盘下载 配置 soapui生成代码时报错 CXF directory must be set in global preferences 下载 需要下载apache-cxf。 官网下载 官网地址&#xff1a; https://www.apache.org/dyn/closer.lua/cxf/3.5.4/apache-cxf-3.5.4.zip 点如下地址即可。 The obj…...

Netty02-基础概念

什么是netty ​ Netty是一个基于Java NIO的异步事件驱动网络应用程序框架。它提供了简单易用的API&#xff0c;用于快速开发可维护的高性能网络应用程序。Netty的设计目标是提供一种高度可扩展的、高性能的网络应用程序框架&#xff0c;使得开发人员能够轻松地构建各种类型的网…...

计算机毕业设计 基于SpringBoot的敬老院管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

精调llama模型

github地址&#xff1a;https://github.com/facebookresearch/llama-recipes github:https://github.com/facebookresearch/llama import torch from transformers import LlamaForCausalLM, LlamaTokenizer#model_id"./models_hf/7B" # 可以从huggingface上面下载模…...

【C语言】深入理解C语言中的数学运算和类型转换

文章目录 引言取负运算的奥秘源码探索分析与解读 浮点数运算的精细差异源码分析精度损失与隐式类型转换 精度和除零运算探究float类型和double类型的精度各是多少&#xff08;即十进制有效位的位数&#xff09;&#xff1f;在你的机器上&#xff0c;“负数开方”是如何处理的&a…...

基于javaweb的宠物服务商城系统设计与开发

摘 要 最近几年以来&#xff0c;宠物在人们的日常生活中所占的地位越来越重要了&#xff0c;它们不仅仅是我们的朋友&#xff0c;也成为了我们家庭中的一份子。21世纪&#xff0c;信息技术飞速发展&#xff0c;计算机行业日新月异&#xff0c;极大地带动了信息的流动&#xff…...

LeetCode-470. 用 Rand7() 实现 Rand10()【数学 拒绝采样 概率与统计 随机化】

LeetCode-470. 用 Rand7 实现 Rand10【数学 拒绝采样 概率与统计 随机化】 题目描述&#xff1a;解题思路一&#xff1a;首先说一个结论就是(rand_X() - 1) Y rand_Y() > [1,X*Y]&#xff0c;即可以等概率的生成[1, X * Y]范围的随机数&#xff0c;其实就像军训的时候报数…...

通达信指标公式19:龙虎榜股票池——主力控盘度的计算方法

0.小红牛本指标&#xff0c;选股的思路说明&#xff1a;控盘度&#xff0c;又称主力控盘&#xff0c;是指主力控制了某只股票的大部分流通股&#xff0c;从而控制了股票的价格。主力控盘的目的通常是为了获取更多的收益&#xff0c;通过控制股票价格来实现其策略。所以首要分析…...

手搓图片滑动验证码_JavaScript进阶

手搓图片滑动验证码 背景代码效果图展示网站 背景 在做前端项目开发的时候&#xff0c;少不了登录注册部分&#xff0c;既然有登录注册就少不了机器人验证&#xff0c;验证的方法有很多种&#xff0c;比如短信验证码、邮箱验证码、图片滑动、图片验证码等。 由于鄙人在开发中…...

Linux服务器超级实用的脚本

1.使用INOTIFY+RSYNC自动实时同步数据 代码执行: bash inotify_rsyncs.sh :cat inotify_rsyncs.sh 脚本内容如下: #!bing/bash # Author: reyn #检测/data路径下的文件变化,排除Temp目录 INOTIFY_CMD="inotifywait -mrq -e modify,create,move,delete /data/ --exc…...

IntelliJ IDEA安装使用教程#intellij idea

做为基础开发软件&#xff0c;idea、pycharm、phpstorm是高级企业级开发中常用的图形化工具。 安装非常简单&#xff1a;去官网下载即可&#xff0c;有社区版本、有企业版本&#xff1a; IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 因版权问题&#xff1a;这里不方面多讲。…...

【组合数学】容斥鸽巢原理

目录 1. 容斥原理容斥原理三种形式 2. 容斥原理应用有限重复数的多重集合的 r 组合数错排问题 3. 鸽巢原理4. Ramsey 定理 1. 容斥原理 容斥原理提供了一种通过计算每个单独集合的大小&#xff0c;然后修正重复计数的方法&#xff0c;从而得到多个集合并集大小的计算方法。它通…...

视频后期特效处理软件 Motion 5 mac中文版

Motion mac是一款运动图形和视频合成软件&#xff0c;适用于Mac OS平台。 Motion mac软件特点 - 精美的效果&#xff1a;Motion提供了多种高质量的运动图形和视频效果&#xff0c;例如3D效果、烟雾效果、粒子效果等&#xff0c;方便用户制作出丰富多彩的视频和动画。 - 高效的工…...

【智能家居】一、工厂模式实现继电器灯控制

用户手册对应的I/O 工厂模式实现继电器灯控制 代码段 controlDevice.h&#xff08;设备设备&#xff09;main.c&#xff08;主函数&#xff09;bathroomLight.c&#xff08;浴室灯&#xff09;bedroomLight.c&#xff08;卧室灯&#xff09;restaurantLight.c&#xff08;餐厅…...

第三节:提供者、消费者、Eureka

一、 提供者 消费者&#xff08;就是个说法、定义&#xff0c;以防别人叭叭时听不懂&#xff09; 服务提供者&#xff1a;业务中被其他微服务调用的服务。&#xff08;提供接口给其他服务调用&#xff09;服务消费者&#xff1a;业务中调用其他微服务的服务。&#xff08;调用…...

Leetcode刷题详解——等差数列划分

1. 题目链接&#xff1a;413. 等差数列划分 2. 题目描述&#xff1a; 如果一个数列 至少有三个元素 &#xff0c;并且任意两个相邻元素之差相同&#xff0c;则称该数列为等差数列。 例如&#xff0c;[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 …...

导出主机上所有docker 镜像并导入到其它主机

保存镜像列表到文件 docker images --format “{{.Repository}}:{{.Tag}}” > image_list.txt 导出列表中所有镜像到tar文件 cat image_list.txt | xargs -L 1 docker save -o all_images.tar 导入tar包中所有镜像 docker load -i all_images.tar...

PaddleOCR迁移学习踩坑记:从数字识别到模型过拟合,我的2万张图白训了?

PaddleOCR迁移学习实战避坑指南&#xff1a;从数字识别到模型优化的深度复盘 在OCR技术应用日益广泛的今天&#xff0c;迁移学习成为快速实现特定场景文字识别的有效手段。然而在实际操作中&#xff0c;许多开发者&#xff08;包括笔者本人&#xff09;都曾陷入"伪迁移学…...

使用Taotoken后API调用延迟稳定在可接受范围且账单清晰可见

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Taotoken后API调用延迟稳定在可接受范围且账单清晰可见 1. 引言 对于需要集成大模型能力的开发者而言&#xff0c;除了模型效…...

CCM实战调校:从原理到精准色彩还原

1. 色彩校正矩阵&#xff08;CCM&#xff09;的核心原理 色彩校正矩阵&#xff08;CCM&#xff09;是图像处理流水线中一个关键的数学工具&#xff0c;它的主要作用是修正相机传感器捕获的颜色与实际场景颜色之间的偏差。想象一下&#xff0c;你用手机拍了一张草莓的照片&…...

手把手教你用wget和md5sum搞定nuScenes数据集下载与校验(Linux/Windows教程)

跨平台高效获取nuScenes数据集&#xff1a;从命令行下载到完整性验证全指南 在自动驾驶和计算机视觉领域&#xff0c;nuScenes数据集因其丰富的传感器数据和精细的标注而成为研究热点。但面对数百GB的数据量&#xff0c;传统下载方式往往力不从心——浏览器下载容易中断&#…...

第十章:C++ 迷你单元测试框架

第十章:C++ 迷你单元测试框架 本章从"写业务"切换到"写工具"。前 9 个案例都是给最终用户看的应用;本案例要做的是给其他程序员用的库——一个百行代码、头文件 only 的单元测试框架(类似 Catch2 的最小骨架)。你将集中练习三件被前 9 个案例覆盖不到位…...

从火箭背包到现代VTOL飞行器:FPGA飞控与传感器融合技术解析

1. 从科幻到现实&#xff1a;个人喷气背包的工程梦想每次看到老式喷气背包的影像&#xff0c;比如那些在早期007电影里出现的、两侧喷着火焰的装置&#xff0c;心里总会涌起一股混合着兴奋与敬畏的复杂情绪。那种感觉&#xff0c;就像小时候第一次拆开收音机&#xff0c;既惊叹…...

机器学习在芯片电容提取中的应用与CapBench数据集

1. 电容提取与机器学习结合的背景与挑战在芯片设计流程中&#xff0c;电容提取是决定最终产品性能的关键环节。当设计进入物理实现阶段&#xff0c;工程师需要精确计算互连线之间的寄生电容&#xff0c;这些数据直接影响时序分析和功耗估算的准确性。传统基于场求解器的方法&am…...

最火 AI 生图模型 Nano Banana Pro 国内免费使用指南

最近在设计圈和 AI 圈&#xff0c;几乎无人不知 Nano Banana Pro。它是谷歌基于 Gemini 3 Pro 打造的最新图像模型&#xff0c;一上线就斩获 LMArena 生图和图像编辑榜单第一名。虽然 Nano Banana 2 的历史成绩更亮眼&#xff0c;但实测体验发现 Pro 版更好用、操作更顺手。 为…...

别再死记硬背Paxos了!用“希腊城邦法案”的故事,5分钟搞懂分布式共识核心

从古希腊议会到区块链&#xff1a;用人类文明史解锁分布式共识的本质 想象一下公元前5世纪的雅典城邦&#xff0c;五百人议会正在为是否建造新战舰争论不休。议员们需要达成一致&#xff0c;但有人中途离席、有人突然反对、甚至传令官可能送错消息——这像极了今天分布式系统中…...

ARM PMU性能监控架构与寄存器详解

1. ARM PMU性能监控架构概述 性能监控单元(Performance Monitoring Unit, PMU)是现代处理器中用于硬件级性能分析的关键模块。作为ARM架构的重要组成部分&#xff0c;PMU通过一组可编程计数器来记录处理器运行过程中发生的各类微架构事件&#xff0c;为系统性能分析和优化提供数…...