λ表达式、智能指针

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;
}

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

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

相关文章

机器学习实验二:决策树模型

系列文章目录 机器学习实验一&#xff1a;线性回归机器学习实验二&#xff1a;决策树模型机器学习实验三&#xff1a;支持向量机模型机器学习实验四&#xff1a;贝叶斯分类器机器学习实验五&#xff1a;集成学习机器学习实验六&#xff1a;聚类 文章目录 系列文章目录一、实验…

linux管道_tee_xargs

5.2 管道 管道命令可以将多条命令组合起来&#xff0c;一次性完成复杂的处理任务。 语法&#xff1a; command1 | command2 | command3...例&#xff1a; 查看passwd中最后3行内容。 cat /etc/passwd | tail -3 查看passwd中包含root所在行的第一条信息。 cat /etc/p…

FPGA串口接收解帧、并逐帧发送有效数据——1

FPGA串口接收解帧、并逐帧发送有效数据 工程实现的功能&#xff1a;FPGA串口接收到串口调试助手发来的数据&#xff0c;将其数据解帧。判断到正确的帧头和帧尾之后&#xff0c;将有效数据存入rx_data中&#xff1b;另一方面发送端将有效数据逐帧发送出去。 参考&#xff1a;正…

RAG落地实践、AI游戏开发、上海·深圳·广州线下工坊启动!星河社区重磅周

飞桨星河社区在成立的5年以来&#xff0c;已汇集660万AI开发者&#xff0c;覆盖深度学习初学者、在职开发者、企业开发者、高校教师、创业者等&#xff0c;已成为AI领域最具影响力的社区之一&#xff0c;无论是AI爱好者还是AI开发者&#xff0c;都能在这里探索AI的无限可能。飞…

城市分站建站系统源码 全新版本SEO推广优化排名高 附带完整的搭建教程

在过去的几年中&#xff0c;许多企业在建立网站时面临一些共同的问题&#xff1a;缺乏技术支持、不懂SEO、预算有限等。这些问题导致他们的网站无法充分发挥作用&#xff0c;无法在搜索引擎中获得良好的排名&#xff0c;进而影响到企业的业务发展。小编来给大家分享一款城市分站…

编译原理词法分析:NFA转DFA(原理+完整代码+可视化实现)

NFA转换为DFA 【本文内容摘要】 什么是DFA通过子集构造法将NFA转换为DFA生成DFA的dot文件并且形成可视化。 如果本文对各位看官有用的话&#xff0c;请记得给一个免费的赞哦&#xff08;收藏也不错&#xff09;&#xff01; 文章目录 NFA转换为DFA一、什么是DFA二、NFA转换为…

k8s引用环境变量

一 定义环境变量 ① 如何在k8s中定义环境变量 env、configmap、secret补充&#xff1a; k8s 创建Service自带的环境变量 ② 从pod属性中获取 kubectl explain deploy.spec.template.spec.containers.env.valueFrom关注&#xff1a; configMapKeyRef、fieldRef 和 resour…

初探Maven

文章目录 一、Maven概述二、安装配置Maven&#xff08;一&#xff09;下载Maven&#xff08;二&#xff09;安装Maven&#xff08;三&#xff09;配置Maven 三、IDEA里配置Maven&#xff08;一&#xff09;版本情况说明&#xff08;二&#xff09;配置构建工具Maven 一、Maven概…

如何批量修改ppt中的字体?

ppt制作已经属于是复杂的操作了&#xff0c;当我们想要更换ppt中的字体&#xff0c;有没有什么快捷的方法呢&#xff1f;今天分享两个方法&#xff0c;一键修改ppt文件字体。 方法一&#xff1a; 找到功能栏中的编辑选项卡&#xff0c;点击替换 – 替换字体&#xff0c;在里面…

python加速方法:纯CPU多进程加速(joblib库)

我写C 代码喜欢用OpenMP进行加速&#xff0c;在不更改源代码情况下只做稍稍修改即可实现CPU利用率最大化&#xff0c;跨平台移植也没有问题。 python是个好东西&#xff0c;苦恼于密级计算的时候只能使用单核&#xff0c;使用多线程不奏效&#xff0c;因为毕竟它受限于语言本身…

【Go】Go语言基础内容

变量声明&#xff1a; 变量声明&#xff1a;在Go中&#xff0c;变量必须先声明然后再使用。声明变量使用 var 关键字&#xff0c;后面跟着变量名和类型&#xff0c;如下所示&#xff1a; var age int这行代码声明了一个名为 age 的整数变量。 变量初始化&#xff1a;您可以在声…

二叉树遍历 LeetCode 1038. 从二叉搜索树到更大和树

1038. 从二叉搜索树到更大和树 给定一个二叉搜索树 root (BST)&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 从图中可以看出&#xff0c;每个节点是BST右中左遍历时&#xff0c;遍历到的节点的值加上之前所有节点的值。 在遍历时可以使…

全球与中国木质颗粒燃料市场:增长趋势、竞争格局与前景展望

木质颗粒汽油的主要优点之一是环境永续性。木质颗粒被认为是碳中立的&#xff0c;因为燃烧过程中释放的二氧化碳量大约等于木材生长过程中吸收的二氧化碳量。这种封闭的碳循环减少了温室气体净排放并减轻了气候变迁的影响。作为一种可再生资源&#xff0c;木屑颗粒还可以透过促…

Python必备神器揭秘:15个最热门库全解析

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python生态系统中拥有大量优秀的库&#xff0c;为开发者提供了广泛且强大的工具。本文将介绍15个最受欢迎的Python库&#xff0c;包括它们的功能、优点以及示例代码&#xff0c;帮助读者更全面地了解和使用这些库…

spring boot mybatis TypeHandler 源码如何初始化及调用

目录 概述使用TypeHandler使用方式在 select | update | insert 中加入 配置文件中指定 源码分析配置文件指定Mapper 执行query如何转换 结束 概述 阅读此文 可以达到 spring boot mybatis TypeHandler 源码如何初始化及如何调用的。 spring boot 版本为 2.7.17&#xff0c;my…

深入理解Go语言GC机制

1、Go 1.3之前的标记-清除&#xff08;mark and sweep&#xff09;算法 Go 1.3之前的时候主要用的是普通的标记-清除算法&#xff0c;此算法主要由两个主要的步骤&#xff1a; 标记&#xff08;Mark phase&#xff09;清除&#xff08;Sweep phase&#xff09; 1&#xff09…

7.Vue UI库

7.Vue UI库 7.1移动端常用的UI库 &#xff08;1&#xff09; Vant&#xff1a;Vant 4 - A lightweight, customizable Vue UI library for mobile web apps.A lightweight, customizable Vue UI library for mobile web apps.https://vant-ui.github.io/vant/#/zh-CN &#xf…

提升--22---ReentrantReadWriteLock读写锁

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 ReadWriteLock----读写锁1.读写锁介绍线程进入读锁的前提条件&#xff1a;线程进入写锁的前提条件&#xff1a;而读写锁有以下三个重要的特性&#xff1a; Reentran…

个体诊所电子处方系统哪个好用,推荐一款可以自由设置配方模板能够填写病历可以查询历史病历的门诊处方笺软件

一、前言 1、功能实用&#xff0c;操作简单&#xff0c;不会电脑也会操作&#xff0c;软件免安装&#xff0c;已内置数据库。 2、中医西医均可用此软件开电子处方&#xff0c;支持病历记录查询&#xff0c;药品进出库管理&#xff0c;支持配方模板一键导入电子处方。 二、电子…

Amazon CodeWhisperer 正式可用, 并面向个人开发者免费开放

文章作者&#xff1a;深度-围观 北京——2023年4月18日&#xff0c;亚马逊云科技宣布&#xff0c;实时 AI 编程助手 Amazon CodeWhisperer 正式可用&#xff0c;同时推出的还有供所有开发人员免费使用的个人版&#xff08;CodeWhisperer Individual&#xff09;。CodeWhisperer…