λ表达式、智能指针
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标准支持,实现匿名函数的功能; 2、通常用于实现轻量级的函数 格式 mutable->返回值{函数体}; // 返回值即使是 void 也必须得写 [] 内,可以填外部数据; () 内,可以带有参数列表。 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发展到现在功能十分的强大,生态异常的丰富,这里面离开不了Spring及其家族产品的支持,而作为Spring生态的明星产品Spring Boot可以说像王者一般的存在,那么的耀眼,那么的光彩夺目!那么…...
soapui报错: CXF directory must be set in global preferences
文章目录 下载官网下载网盘下载 配置 soapui生成代码时报错 CXF directory must be set in global preferences 下载 需要下载apache-cxf。 官网下载 官网地址: 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,用于快速开发可维护的高性能网络应用程序。Netty的设计目标是提供一种高度可扩展的、高性能的网络应用程序框架,使得开发人员能够轻松地构建各种类型的网…...
计算机毕业设计 基于SpringBoot的敬老院管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
精调llama模型
github地址: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类型的精度各是多少(即十进制有效位的位数)?在你的机器上,“负数开方”是如何处理的&a…...
基于javaweb的宠物服务商城系统设计与开发
摘 要 最近几年以来,宠物在人们的日常生活中所占的地位越来越重要了,它们不仅仅是我们的朋友,也成为了我们家庭中的一份子。21世纪,信息技术飞速发展,计算机行业日新月异,极大地带动了信息的流动ÿ…...
LeetCode-470. 用 Rand7() 实现 Rand10()【数学 拒绝采样 概率与统计 随机化】
LeetCode-470. 用 Rand7 实现 Rand10【数学 拒绝采样 概率与统计 随机化】 题目描述:解题思路一:首先说一个结论就是(rand_X() - 1) Y rand_Y() > [1,X*Y],即可以等概率的生成[1, X * Y]范围的随机数,其实就像军训的时候报数…...
通达信指标公式19:龙虎榜股票池——主力控盘度的计算方法
0.小红牛本指标,选股的思路说明:控盘度,又称主力控盘,是指主力控制了某只股票的大部分流通股,从而控制了股票的价格。主力控盘的目的通常是为了获取更多的收益,通过控制股票价格来实现其策略。所以首要分析…...
手搓图片滑动验证码_JavaScript进阶
手搓图片滑动验证码 背景代码效果图展示网站 背景 在做前端项目开发的时候,少不了登录注册部分,既然有登录注册就少不了机器人验证,验证的方法有很多种,比如短信验证码、邮箱验证码、图片滑动、图片验证码等。 由于鄙人在开发中…...
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
做为基础开发软件,idea、pycharm、phpstorm是高级企业级开发中常用的图形化工具。 安装非常简单:去官网下载即可,有社区版本、有企业版本: IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 因版权问题:这里不方面多讲。…...
【组合数学】容斥鸽巢原理
目录 1. 容斥原理容斥原理三种形式 2. 容斥原理应用有限重复数的多重集合的 r 组合数错排问题 3. 鸽巢原理4. Ramsey 定理 1. 容斥原理 容斥原理提供了一种通过计算每个单独集合的大小,然后修正重复计数的方法,从而得到多个集合并集大小的计算方法。它通…...
视频后期特效处理软件 Motion 5 mac中文版
Motion mac是一款运动图形和视频合成软件,适用于Mac OS平台。 Motion mac软件特点 - 精美的效果:Motion提供了多种高质量的运动图形和视频效果,例如3D效果、烟雾效果、粒子效果等,方便用户制作出丰富多彩的视频和动画。 - 高效的工…...
【智能家居】一、工厂模式实现继电器灯控制
用户手册对应的I/O 工厂模式实现继电器灯控制 代码段 controlDevice.h(设备设备)main.c(主函数)bathroomLight.c(浴室灯)bedroomLight.c(卧室灯)restaurantLight.c(餐厅…...
第三节:提供者、消费者、Eureka
一、 提供者 消费者(就是个说法、定义,以防别人叭叭时听不懂) 服务提供者:业务中被其他微服务调用的服务。(提供接口给其他服务调用)服务消费者:业务中调用其他微服务的服务。(调用…...
Leetcode刷题详解——等差数列划分
1. 题目链接:413. 等差数列划分 2. 题目描述: 如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,[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...
HTML5+CSS3+JS小实例:焦点图波浪切换动画特效
实例:焦点图波浪切换动画特效 技术栈:HTML+CSS+JS 字体图标库:Font Awesome 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name=&…...
Mac电脑如何安装git
一、简介 在Mac上安装Git之前,可以先使用git --version来查看一下是否安装了Git,因为Mac系统可能自带了Git,或者在你安装XCode(或者XCode的命令行工具)时,可能已经安装了 Git。 如果Mac还没有安装Git的话&…...
macOS本地调试k8s源码
目录 准备工作创建集群注意点1. kubeconfig未正常加载2. container runtime is not running3. The connection to the server 172.16.190.132:6443 was refused - did you specify the right host or port?4. 集群重置5.加入子节点 代码调试 准备工作 apple m1芯片 安装vmwa…...
JS 实现一键复制文本内容
1、演示: 2、代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>一键复制</title&g…...
【Linux】echo命令使用
echo命令 功能是在显示器上显示一段文字,一般起到一个提示的作用。此外,也可以直接在文件中写入要写的内容。也可以用于脚本编程时显示某一个变量的值,或者直接输出指定的字符串。 著者 由布莱恩福克斯和切特拉米撰写。 语法 echo […...
Day03 嵌入式---中断
目录 一、简单介绍 二、总体框架 三、NVIC 3.2 NVIC的寄存器 3.3 中断向量表 3.4 中断优先级 3.5 NVIC优先级分组 3.6 NVIC配置 3.6.1、设置中断分组 3.6.2、初始化 四、EXTI 外部中断 4.1.EXTI的基本概念 4.2.EXTI的⼯作原理 4.3 EXTI配置 五、SYSCFG 5.1 SYS…...
wpf devexpress 使用IDataErrorInfo实现input验证
此处下载源码 当form初始化显示,Register按钮应该启动和没有输入错误应该显示。如果用户点击注册按钮在特定的输入无效数据,form将显示输入错误和禁用的注册按钮。实现逻辑在标准的IDataErrorInfo接口。请查阅IDataErrorInfo接口(System.Com…...
shell_81.Linux在命令行中创建使用函数
在命令行中使用函数 在命令行中创建函数 两种方法 单行方式来定义函数: $ function divem { echo $[ $1 / $2 ]; } $ divem 100 5 20 $ 当你在命令行中定义函数时,必须在每个命令后面加个分号,这样 shell 就能知道哪里是命令的起止了&am…...
鱼香ROS一键安装命令(支持微信、docker、ros等)
按照指定的数字选择即可。 wget http://fishros.com/install -O fishros && . fishros小鱼的一键安装系列 [14个ROS版本任你选]一键安装Docker使用指南...
深入理解 Go 函数:从基础到高级
一、函数基础 1、函数定义 函数是组织好的、可重复使用的、用于执行指定任务的代码块Go 语言中支持:函数、匿名函数和闭包 package mainimport "fmt"func main(){ret : intSum(1,2)fmt.PrintIn(ret) //3 }func instSum(x,y int) int {return x y }…...
wordpress 缩略图截图/成都今天宣布的最新疫情消息
1.将程序内部时区设置为UTC时间.(UTC 也可以叫 GMT)PHP设置:date_default_timezone_set("UTC");Yii设置:config/main.php 中添加 :timeZone>UTC,如此设置后,PHP生成的时间基本都是UTC时间了.例如://输出当前UTC时间date("Y-m-d H:i:s");2.数据库中存储U…...
wordpress wpuf/中文域名交易网站
先获取div img 先清空img 给刚加载时设定初始图片 img.empty(); img.append("<img srcimg/1.jpg />");设置定时器 每4秒给i6自增1 当超过图片数量时将i6重新设定为0 开始新的自增 下面是js $(document).ready(function(){ var img$("#img");var …...
宁波专业做网站/天津百度网站快速排名
selenium是thoughtworks公司开发的一款开源的测试工具,主要用来做web端的自动化测试。Python安装selenium,直接使用执行pip install selenium(python)命令安装即可,默认安装的是最新的,也就是selenium的3.x…...
建设中小企业网站/精准推广引流5000客源
2019独角兽企业重金招聘Python工程师标准>>> 开源IDE,LightTable,比较小巧,居然有种完爆我大Sublime的赶脚,可惜全是英文的,特此记录一些用法。 其实就是它自带的帮助文档,不过全是英文,全当练翻…...
wordpress媒体默认链接/灰色行业推广平台网站
使用 <script setup>组合式 API 的语法糖的时候,defineProps报错: 代码如下: 第一次写vue3的项目,真的是到处都是坑啊,我就不断的百度百度再百度,发现再 module.exports {root: true,env: {node: …...
好看的网站设计/推广普通话手抄报内容大全
一.问题描述 给你一个树,请你 按中序遍历 重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。 示例 : 输入:[5,3,6,2,4,null,8,1,null,null,null,7,9] 5/ \3 6…...