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

【c++11】c++11新特性(下)(可变参数模板、default和delete、容器新设定、包装器)

🌟🌟作者主页:ephemerals__
🌟🌟所属专栏:C++

目录

前言

五、可变参数模板

1. 概念及简单定义

2. 包扩展

六、 default和delete

七、容器新设定

1. 新容器

2. 新接口

emplace系列接口

八、函数包装器

1. function

2. bind

总结


前言

        之前我们学习了c++11的部分新特性:列表初始化、右值引用、类的新默认成员函数和lambda表达式等:

【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)-CSDN博客

本篇文章,我们继续学习其余几个:可变参数模板、default和delete、容器新设定、包装器

正文开始

五、可变参数模板

1. 概念及简单定义

        所谓可变参数模板,就是指模板可以接收可变数量的参数。通过处理不同数量的参数类型,代码的灵活性和重用性大大提高。

可变参数模板可以用于类模板,也可用于函数模板。

可变参数模板不仅支持类型实例化,也可支持个数实例化。(参数数量可以变化)

当然,可变参数的函数模板当中,其函数的参数也是可变的。

接下来我们定义一个简易的可变参数模板:

#include <iostream>
using namespace std;//可变参数模板
template<class ...Args>
void print(Args... args)
{cout << sizeof...(args) << endl;
}int main()
{print(1);print(1, 2, 3);print('a', "xxxx", 3.5, 9);return 0;
}

这里有几点需要注意:

1. 模板参数定义时,要在前面加上“...”,表示这是一个可变模板参数。这里的Args叫做“模板参数包”,它可以接收多个任意类型的参数,在编译时按需实例化。

2. 函数参数的类型使用模板参数包进行定义,其变量名args叫做“函数参数包”,表示多个函数形参。注意函数参数包前面要加上“...”。

3. 模板参数包和函数参数包可以任意取名,不一定非得是“Args”或者“args”。

4. 函数体当中,我们使用了一个新的运算符“sizeof...”它用于计算函数参数包中的参数个数

程序运行结果:

这里我们调用了三次print函数,这三次调用使得可变参数模板的形参列表被分别实例化为:

void print<int>(int args);
void print<int, int, int>(int args, int args, int args);
void print<char, const char *, double, int>(char args, const char *args, double args, int args);

因此,可变参数模板和普通模板的原理还是类似的,本质还是按需实例化,只不过额外支持了参数个数的实例化。

当然,可变参数模板的函数形参也可以用左值引用或右值引用表示,其折叠规则与普通模板相同。

void print(Args... args)
void print(Args&... args)
void print(Args&&... args)

2. 包扩展

        刚才我们定义的可变参数模板当中,只是计算了参数的个数并输出,若只能如此的话,未免也太缺乏实用性了。那么能否对每一个参数进行相应的处理呢? 这里就要使用“包扩展”了。

        所谓“包扩展”,是c++11引入的一个机制,用于分解出函数参数包中的一个个参数。要实现包扩展,就要使用包扩展运算符“...”

一个简单的使用示例:

#include <iostream>
using namespace std;//可变参数模板
template<class ...Args>
void print(Args... args)
{(cout << ... << args) << endl;
}int main()
{print(1, 2, 'a');return 0;
}

运行结果:

这里我们使用了“...”将args进行扩展,然后一个个地输出。但这种方法的原理较难理解,并且灵活性也较差,所以我们通常用编译时递归实例化的方式进行包扩展。示例如下:

#include <iostream>
using namespace std;void ShowList()//递归出口,无参
{cout << endl;
}template<class T, class ...Args>
void ShowList(T&& x, Args&&... args)//接收第一个参数和剩余参数包
{cout << x << ' ';//打印第一个参数ShowList(forward<Args>(args)...);//将剩余参数包一个个展开,并传入,递归调用
}template<class ...Args>
void Print(Args&&... args)
{ShowList(forward<Args>(args)...);//将参数包一个个展开,并传入
}int main()
{Print(1, 2, 'a');//函数调用return 0;
}

运行结果: 

不难发现,这里的扩展方法十分巧妙:先使用Print将多个参数打包成函数参数包,然后使用“...”进行扩展,并传入ShowList。ShowList也是一个可变参数模板,它将接收到的参数分解成两部分:第一个参数和剩余部分,并将剩余部分打包成一个新的参数包。函数体内部打印了第一个参数后,将剩余参数包再传给自己去调用,这样递归地传入下去,编译器在编译时一个个地按需实例化对应版本,就能够一个一个地输出所有参数了。而当所有参数都被打印后,再次传给自己的参数包就是无参的,此时由于我们定义了一个同名无参函数当函数模板和同名函数同时符合参数要求时,会优先调用同名函数,这样就相当于递归出口,终止了函数模板的递归调用。

注:这里将参数进行完美转发后传入,是为了保持右值属性,减少递归时的拷贝。

需要注意:传入参数包时,一定要配合包扩展运算符,将参数包分解之后再传入;注意将包括展运算符与参数列表中的“...”区分开,它们不是同一个含义;包扩展运算符要写在参数包之后。

当然,递归式的包扩展也可以这样实现,原理是一样的:

template <class T>
void Print(T&& x) 
{cout << x << ' ';
}template <class T, class ... Args>
void Print(T&& x, Args&&... args) 
{cout << x << ' ';Print(forward<Args>(args)...);
}

六、 default和delete

        c++11引入了default和delete这两个关键字(用于类的定义中),它们的作用是对类的默认成员函数进行显式的控制。

        假如你要使用某个默认生成的成员函数,但由于一些原因,并没有默认生成,此时你就可以使用default强制生成对应默认成员函数。使用示例:

class A
{
public:A(const A& a)//只显式实现了拷贝构造,因此不会生成默认的移动构造和构造函数{//...}A(A&& a) = default;//强制生成移动构造A() = default;//强制生成默认构造函数
private://...
};

        如果你想限制某些默认成员函数,使其不可被外界显式调用,可以将其设置为私有成员,也可以使用delete关键字,将其强制删除。示例:

class A
{
public:A& operator=(const A& a) = delete;//强制删除赋值重载private://...
};

注:强制删除某个默认成员函数后,该成员函数也不可显式实现。

七、容器新设定

1. 新容器

        c++11引入了几个新的STL容器,例如array(定长数组)forward_list(单链表)unordered系列容器。其中最为实用的还是unordered系列容器,可以将哈希的高效性充分融入到实际开发中。

c++11 STL容器介绍与使用方法查阅:Reference - C++ Reference

2. 新接口

        由于右值引用initializer_list的出现,c++11还引入了容器插入、拷贝、初始化相关的全新重载版本,提高了效率。

emplace系列接口

        c++11还引入了容器的emplace系列接口,相比push_back、insert等接口,它的特点是直接在容器内部构造元素,而不是而不是先创建临时对象再拷贝或移动到容器中,更加高效

举个例子:

#include <iostream>
#include <list>
#include <string>
using namespace std;int main()
{list<string> l;l.push_back("hello world");l.emplace_back("hello world");return 0;
}

这里我们分别调用push_back、emplace_back给list尾插两个字符串,相比push_back,emplace_back会更加高效。因为调用push_back时,首先会将"hello world"构造为string类型得临时对象,然后再执行插入操作,最后析构这个string的临时对象;而emplace_back是一个可变参数模板,传入"hello world"之后,被实例化为const str*类型,之后直接用字符串构造出一个节点,避免产生string的临时对象,效率更高。

并且,由于其是可变参数模板,所以也支持多个参数传入,并构造节点:

list<pair<string, int>> l;
l.push_back({ "苹果",1 });
l.emplace_back("苹果", 1); // 多参数传入

当然,许多容器除了emplace_back,还有emplace_frontemplace接口,分别支持头插和任意位置的插入操作。

八、函数包装器

        函数包装器是c++11引入的工具,它可以对函数进行“封装”,后续需要时调用,功能类似于函数指针,且更加安全。c++11的函数包装器一共有两个:functionbind

1. function

        function本质是一个类模板,包含在头文件<functional>中,它可以接收一个可调用对象,例如函数指针、lambda表达式、仿函数对象等,并可以通过function调用它。这样就可以将不同类型的可调用对象统一化。示例:

#include <iostream>
#include <functional>
using namespace std;//函数
int f1(int a, int b)
{return a + b;
}//仿函数
struct F2
{int operator()(int a, int b){return a - b;}
}f2; //lambda表达式
auto f3 = [](int a, int b)->int{ return a * b; };int main()
{//定义包装器,其接收的可调用对象,参数为两个int,返回值为intfunction<int(int, int)> f;//使用包装器调用可调用对象f = f1; // 接收函数cout << f(3, 5) << endl;f = f2; // 接收仿函数对象cout << f(3, 5) << endl;f = f3; // 接收lambda表达式cout << f(3, 5) << endl;return 0;
}

运行结果:

定义function时,注意要显式实例化要接收对象的参数和返回值;调用时,直接用函数调用的方式进行传参。

注意:用function包装非静态成员函数时,别忘记第一个参数是this指针,显式实例化时要将对象指针类型写在参数列表中:

#include <iostream>
#include <functional>
using namespace std;class A
{
public:A(int n, int m):_n(n), _m(m){}void Print(){cout << _n + _m << endl;}
private:int _n;int _m;
};int main()
{A a(1, 2);function<void(A*)> f1 = &A::Print; // 包装成员函数Printf1(&a); // 调用时传入对象地址return 0;
}

当然,参数也可以不设置为对象指针,可以直接设置成对象本身或对象的引用类型,传参时传入对象即可:

function<void(A)> f2 = &A::Print;
f2(a);function<void(A&)> f3 = &A::Print;
f3(a);function<void(A&&)> f4 = &A::Print;
f4(move(a));

2. bind

        bind的本质是一个函数模板, 包含在头文件<functional>中,它也可以接收可调用对象,但与function不同的是,它可以返回一个在原对象基础上调整传参顺序增加默认参数的可调用对象,更加灵活。

它的基本使用方式如下:

#include <iostream>
#include <functional>
using namespace std;
using placeholders::_1;
using placeholders::_2;
using placeholders::_3;void fun(int a, int b, int c)
{cout << a << endl;cout << b << endl;cout << c << endl;
}int main()
{auto f = bind(fun, _1, _2, _3); // 包装fun函数//函数调用f(1, 2, 3);return 0;
}

运行结果:

使用bind包装fun函数时,bind的参数列表第一个位置是fun函数的地址其余位置表示要传入的参数的代号(注意这个代号在std的placeholders空间中,这里为了方便直接展开了)。然后用一个auto变量接收bind的返回值,就可以对fun函数进行调用。

改变bind的代号的顺序,就可以调整传参顺序:

int main()
{auto f = bind(fun, _1, _3, _2); // 调整第二个参数和第三个参数的相对位置//函数调用f(10, 20, 30);return 0;
}

运行结果:

这里我们在包装fun时,交换了第三个参数和第二个参数的相对位置,调用fun时的参数就会按照包装时的顺序进行传入,而不是从左到右的顺序,这样可以使一些原型不一致的函数进行适配

在bind代号位置传入初值,就可以为任意参数设置初值:

int main()
{auto f = bind(fun, _1, 5, _2); // 给第二个参数设置初值5,注意这里的_2不是表示函数的第二个参数,而是调用时传入的第二个参数//函数调用f(10, 20);return 0;
}

运行结果:

相比缺省参数,它的好处是可以给任意位置的参数设置初值,而缺省参数只能从右到左设初值。 

有了bind之后,我们就可以绑死一些参数,例如成员函数的对象,这样每次调用成员函数就不用显式写明对象了。

总结

        本篇文章我们学习了c++11的四个新语法:可变参数模板、default和delete、容器的新设定和函数包装器。它们大大提高了c++编程的灵活性,也提高了我们的开发效率。之后博主会和大家分享智能指针以及其他包装器的相关知识和用法。如果你觉得博主讲的还不错,就请留下一个小小的赞在走哦,感谢大家的支持❤❤❤

相关文章:

【c++11】c++11新特性(下)(可变参数模板、default和delete、容器新设定、包装器)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C 目录 前言 五、可变参数模板 1. 概念及简单定义 2. 包扩展 六、 default和delete 七、容器新设定 1. 新容器 2. 新接口 emplace系列接口 八、函数包…...

fps项目总结:生成武器子弹

文章目录 spawn actor&#xff1a;生成武器固定生成&#xff1a;因为武器的碰撞设为noCollision attach actor to component&#xff1a;将武器附加到骨骼上&#xff0c;成为mesh的子组件对齐到目标&#xff1a;对齐到插槽 子弹阻挡的前提是根组件为碰撞体子弹对碰撞体全是阻挡…...

大模型备案对模型训练语料的要求

昨天接到一位客户的咨询&#xff0c;说他们的模型还在开发阶段&#xff0c;想提前了解一下大模型备案政策中对于模型训练语料有什么具体要求&#xff0c;提前规避一下。客户确实有前瞻性&#xff0c;考虑得比较充分。训练语料在研发阶段至关重要&#xff0c;直接影响模型的性能…...

Ethan独立开发产品日报 | 2025-04-24

1. Peek AI个人财务教练&#xff0c;帮助你做出决策。 Peek的人工智能助手提供主动的跟踪服务——它会分析你的消费习惯&#xff0c;并以细腻而积极的方式帮助你调整这些习惯。没有评判&#xff0c;也没有负担。就像是为你的财务量身定制的Spotify Wrapped&#xff0c;完美贴…...

egg环境搭建

前言 egg.js 是由阿里开源的面向企业级开发的 Node.js 服务端框架&#xff0c;它的底层是由 Koa2 搭建。 Github&#xff1a;https://github.com/eggjs/egg&#xff0c;目前 14.8K Star&#xff0c;egg 很适合做中台。 安装 首先&#xff0c;你要 确保 Node 已经配置环境变量…...

Linux的基础指令

目录 1、Shell及运行原理 2、热键 3、Linux的基础知识 4、Linux的基础指令 4.1 man 4.2 clear&&history&&whoami 4.3 pwd 4.4 ls 4.5 cd 4.6 mkdir&&touch 1. mkdir 2. touch 4.7 rmdir&&rm 1. rmdir 2. rm 4.8 cp&&mv…...

第一部分:git基本操作

目录 1、git初识 1.1、存在的问题 1.2、版本控制器 1.3、git安装 1.3.1、CentOS平台 1.3.2、ubuntu平台 2、git基本操作 2.1、创建仓库 2.2、配置git 3、工作区、暂存区、版本库 4、基本操作 4.1、场景一 4.2、场景二 4.3、修改文件 5、版本回退 6、撤销修改 …...

Kafka和其他组件的整合

Kafka和其他组件的整合 1.Kafka和Flume的整合 需求1&#xff1a;利用flume监控某目录中新生成的文件&#xff0c;将监控到的变更数据发送给kafka&#xff0c;kafka将收到的数据打印到控制台&#xff1a; 在flume/conf下添加.conf文件&#xff0c; vi flume-kafka.conf # 定…...

学习AI必知的20大概念

&#x1f3af;AI开发者必知的20大概念 ​&#x1f916; 机器学习&#xff1a;基础算法和模型训练。 &#x1f9e0; 深度学习&#xff1a;复杂表示学习。 &#x1f310; 神经网络&#xff1a;非线性关系建模。 &#x1f5e3;️ NLP&#xff1a;文本处理和理解。 &#x1f441;️…...

VRRP与防火墙双机热备实验

目录 实验一&#xff1a;VRRP负载均衡与故障切换 实验拓扑​编辑一、实验配置步骤 1. 基础网络配置 2. VRRP双组配置 二、关键验证命令 1. 查看VRRP状态 2. 路由表验证 三、流量分析 正常负载均衡场景&#xff1a; 故障切换验证&#xff1a; 实验二&#xff1a;防火…...

【金仓数据库征文】——选择金仓,选择胜利

目录 第一部分&#xff1a;金仓数据库——开创数据库技术的新时代 1.1 金仓数据库的技术底蕴 1.2 高可用架构与灾备能力 1.3 分布式架构与弹性扩展能力 第二部分&#xff1a;金仓数据库助力行业数字化转型 2.1 电信行业&#xff1a;核心系统国产化替代 2.2 医疗行业&…...

微软官网Win10镜像下载快速获取ISO文件

如何从微软官网轻松下载win10镜像&#xff1f;win10镜像的下载方式主要包括两种&#xff1a; 目录 一&#xff1a;借助官方工具 二&#xff1a;直接微软官网通过浏览器进行下载。 三&#xff1a;实现方法与步骤&#xff1a; 1&#xff1a;利用微软官方提供的MediaCreationT…...

发放优惠券

文章目录 概要整体架构流程技术细节小结 概要 发放优惠券 处于暂停状态&#xff0c;或者待发放状态的优惠券&#xff0c;在优惠券列表中才会出现发放按钮&#xff0c;可以被发放&#xff1a; 需求分析以及接口设计 需要我们选择发放方式&#xff0c;使用期限。 发放方式分…...

【专题刷题】二分查找(二)

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…...

如何避免IDEA每次打开新项目都重复配置Maven?

每次打开新项目都要重新设置Maven路径&#xff1f;每次导入工程都要手动调整settings.xml&#xff1f;如果你也受够了IDEA这种“健忘”行为&#xff0c;那么这篇文章就是为你准备的&#xff01;今天我们就来彻底解决这个问题&#xff0c;让IDEA记住你的Maven配置&#xff0c;一…...

【Linux网络编程】应用层协议HTTP(实现一个简单的http服务)

目录 前言 一&#xff0c;HTTP协议 1&#xff0c;认识URL 2&#xff0c;urlencode和urldecode 3&#xff0c;HTTP协议请求与响应格式 二&#xff0c;myhttp服务器端代码的编写 HTTP请求报文示例 HTTP应答报文示例 代码编写 网络通信模块 处理请求和发送应答模块 结…...

深度解析之算法之分治(快排)

44.颜色分类 题目链接 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地 对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置…...

【金仓数据库征文】-金仓数据库性能调优 “快准稳” 攻略:实战优化,让数据处理飞起来

我的个人主页 我的专栏&#xff1a; 人工智能领域、java-数据结构、Javase、C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01; 点赞&#x1f44d;收藏❤ 目录 一、KingbaseES金仓数据库简介二、快速入门&#xff1a;金仓数据库下载与安装指南三、“快”…...

DPIN河内AI+DePIN峰会:共绘蓝图,加速构建去中心化AI基础设施新生态

近日&#xff0c;一场聚焦前沿科技融合的盛会——AIDePIN峰会在越南河内成功举办。此次峰会由DPIN、QPIN及42DAO等Web3领域的创新项目联合组织&#xff0c;汇聚了众多Web3行业领袖、技术专家与社区成员。峰会于2025年4月19日举行&#xff0c;其核心议题围绕去中心化物理基础设施…...

vscode和git 踩坑

git init经常 在 vscode push错误问题: 正确姿势&#xff1a;先 GitHub 上建仓库 → git clone 拉到本地 → 再用 VSCode 打开编辑 ❌ 不是&#xff1a;VSCode 里 git init → 再去 GitHub 选个仓库绑定 举个对比 操作流程是否推荐后果GitHub 创建仓库 → git clone → 用 VSC…...

C++11介绍

目录 一、C11的两个小点 1.1、decltype 1.2、nullptr 二、列表初始化 2.1、C98传统的{} 2.2、C11中的{} 2.3、C11中的std::initializer_list 三、右值引用和移动语义 3.1、左值和右值 3.2、左值引用和右值引用 3.3、引用延长生命周期 3.4、左值和右值的参数匹配 3…...

AI数字人:繁荣背后的伦理困境与法律迷局(8/10)

摘要&#xff1a;本文深入剖析 AI 数字人从虚拟走向现实的历程&#xff0c;阐述其融合多技术实现从静态到动态交互的跨越&#xff0c;爆发式应用于各领域带来的商业价值与社会影响&#xff0c;同时直面由此引发的伦理法律挑战&#xff0c;包括身份认同、数据隐私、责任归属及权…...

SOLID 原则在单片机环境下的 C 语言实现示例,结合嵌入式开发常见场景进行详细说明

1. 单一职责原则 (SRP) 定义:一个模块(函数/文件)只负责一个功能。 示例:传感器数据采集与处理分离 // SensorAdc.h - 仅负责ADC原始数据采集 typedef struct { uint16_t (*ReadRaw)(void); // 原始数据读取接口 } SensorAdc; // SensorProcessor.h - 仅负责数据处理…...

RT Thread 发生异常时打印输出cpu寄存器信息和栈数据

打印输出发生hardfault时,当前栈十六进制数据和cpu寄存器信息 在发生 HardFault 时,打印当前栈的十六进制数据和 CPU 寄存器信息是非常重要的调试手段。以下是如何实现这一功能的具体步骤和示例代码。 1. 实现 HardFault 处理函数 我们需要在 HardFault 中捕获异常上下文,…...

SQL 函数进行左边自动补位fnPadLeft和FORMAT

目录 1.问题 2.解决 方式1 方式2 3.结果 1.问题 例如在SQL存储过程中&#xff0c;将1 或10 或 100 长度不足的时候&#xff0c;自动补足长度。 例如 1 → 001 10→ 010 100→100 2.解决 方式1 SELECT FORMAT (1, 000) AS FormattedNum; SELECT FORMAT(12, 000) AS Form…...

Unity中数据和资源加密(异或加密,AES加密,MD5加密)

在项目开发中,始终会涉及到的一个问题,就是信息安全,在调用接口,或者加载的资源,都会涉及安全问题,因此就出现了各种各样的加密方式。 常见的也是目前用的最广的加密方式,分别是:DES、3DES、AES、MD5、XOR(异或) 其中DES、3DES、AES、MD5用在数据加密中偏多,特别是…...

C++初窥门径

const关键字 一、const关键字 修饰成员变量 常成员变量&#xff1a;必须通过构造函数的初始化列表进行初始化&#xff0c;且初始化后不可修改。 示例&#xff1a; class Student { private: const int age; // 常成员变量 public: Student(string name, int age) : age(ag…...

Spring知识点总结

目录 1.什么是spring&#xff1f;你对spring的理解&#xff1f; 2.spring的优缺点&#xff1f; 3.解释一下IOC和AOP&#xff1f; 4.IOC和DI的区别&#xff1f; 5.spring中管理对象注入的方式&#xff1f; 6.自动注入的注解有哪些&#xff1f; 声明bean的注解 Bean的生命…...

Oracle_开启归档日志和重做日志

在Oracle中&#xff0c;类似于MySQL的binlog的机制是归档日志&#xff08;Archive Log&#xff09;和重做日志&#xff08;Redo Log&#xff09; 查询归档日志状态 SELECT log_mode FROM v$database; – 输出示例&#xff1a; – LOG_MODE – ARCHIVELOG (表示已开启) – NO…...

【金仓数据库征文】-数据库界新兴前列者,本篇带你速懂金仓数据库!

最近写课程设计、搞毕设是不是被数据库折腾到崩溃&#xff1f;动不动就报错、数据迁移还超麻烦&#xff01;今天挖到个宝藏 —— 国产金仓数据库 KingbaseES&#xff0c;操作超简单&#xff0c;还自带 “翻译器” 帮你迁移数据&#xff01;性能强还稳定&#xff0c;关键完全免费…...

人工智能与机器学习,谁是谁的子集 —— 再谈智能的边界与演进路径

人工智能&#xff08;Artificial Intelligence, AI&#xff09;作为当代最具影响力的前沿技术之一&#xff0c;常被大众简化为 “深度学习” 或 “大模型” 等标签。然而&#xff0c;这种简化认知往往掩盖了AI技术内部结构的复杂性与多样性。事实上&#xff0c;AI并非单一方法的…...

Linux进程学习【进程状态】

&#x1f33c;&#x1f33c;前言&#xff1a;在操作系统中&#xff0c;进程是最基本的资源管理单位&#xff0c;而操作系统通过精确管理这些进程的状态来确保系统能够高效运行。进程的状态不仅仅是操作系统设计的一部分&#xff0c;它对系统的性能、稳定性以及资源的分配起着至…...

用 ESP32 模拟 Wiegand 刷卡器:开发门禁系统必备的小工具

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

什么是 MCP?与 AI Agent 的关系是什么?

首先先回答一下什么是MCP&#xff1f; 如果你经常使用像Claude这样的大语言模型&#xff0c;你可能已经注意到它们虽然强大&#xff0c;但有时候也有局限性&#xff0c;比如无法获取实时信息或访问特定工具。 模型上下文协议&#xff08;Model Context Protocol&#xff0c;简…...

Python ZIP文件操作全解析:从基础压缩到高级技巧

目录 一、ZIP文件操作基础三板斧 1.1 创建压缩包 1.2 解压操作 1.3 文件遍历与信息获取 二、进阶技巧&#xff1a;让压缩更智能 2.1 加密压缩实战 2.2 增量更新策略 2.3 性能优化技巧 三、高级场景解决方案 3.1 分卷压缩实现 3.2 跨平台路径处理 3.3 异常处理最佳实…...

Linux:进程的等待

当以一个进程结束时&#xff0c;它会变成僵尸进程&#xff0c;这个僵尸进程如果不处理&#xff0c;就会一直占用CPU资源&#xff0c;如果父进程要回收这个进程会通过进程等待的方式处理&#xff0c;回收子进程只会&#xff0c;会得到进程的退出信息 进程等待 父进程通过进程等…...

玉米产量遥感估产系统的开发实践(持续迭代与更新)

项目地址&#xff1a;项目首页 - maize_yield_estimation:玉米估产的flaskvue项目 - GitCode 开发中&#xff0c;敬请期待。。。 以下是预先写的提纲&#xff0c;准备慢慢补充 一、项目背景与工程目标 业务需求分析 农业遥感估产的行业痛点&#xff08;数据分散、模型精度不足…...

Python解析地址中省市区街道

Python解析地址中省市区街道 1、效果 输入&#xff1a;海珠区沙园街道西基村 输出&#xff1a; 2、导入库 pip install jionlp3、示例代码 import jionlp as jiotext 海珠区沙园街道西基村 res jio.parse_location(text, town_villageTrue) print(res)...

论文学习:《聚类矩阵正则化指导的层次图池化》

原文标题&#xff1a;Clustering matrix regularization guided hierarchical graph pooling 原文链接&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0950705125001558 图池化技术大致可以分为两类&#xff1a;平面图池化和层次图池化。后者通过迭代粗化…...

【金仓数据库征文】- 国产化迁移实战:从Oracle到KingbaseES的平滑过渡

文章目录 引言&#xff1a;国产数据库的崛起与迁移需求一、兼容性架构设计与配置优化1.1 Oracle兼容模式的核心实现1.2 潜在语法差异的深度处理1.3 环境预配置关键技术1.3.1 用户与模式映射1.3.2 字符集与日期格式 1.4 深度兼容模式配置1.4.1 语法兼容开关1.4.2 数据类型映射策…...

「零配置陷阱」:现代全栈工具链的复杂度管控实践

一、工具链膨胀的「死亡螺旋」 2024年典型全栈项目的初始化噩梦&#xff1a; $ npm create vitelatest ✔ Project name: … demo ✔ Select a framework: › React ✔ Select a variant: › TypeScript SWC ✔ Install shadcn/ui? … Yes ✔ Add Storybook? … Yes ✔ Co…...

浅析锁的应用与场景

锁的应用与场景&#xff1a;从单机到分布式 摘要&#xff1a;在多线程和分布式系统中&#xff0c;“锁”是避免资源竞争、保障数据一致性的核心机制。但你真的了解锁吗&#xff1f;什么时候该用锁&#xff1f;用哪种锁&#xff1f;本文通过通俗的比喻和代码示例&#xff0c;带…...

图论---Kruskal(稀疏图)

O( m * log n )。 1&#xff0c;将所有边按权重从小到大排序&#xff0c;调用系统的sort() 2&#xff0c;枚举每条边的 a , b ,权重 if(a、b 不联通) 就将这条边加入集合中 // 最小生成树 —Kruskal算法(稀疏图) #include<iostream> #include<algorithm> using …...

MySQL 从入门到精通:第二篇 - 数据类型、约束与索引

1. MySQL数据类型详解 数值类型 整数类型 -- 常用整数类型及范围 CREATE TABLE integer_types (tiny_col TINYINT, -- 1字节,有符号(-128~127),无符号(0~255)small_col SMALLINT, -- 2字节,有符号(-32768~32767),无符号(0~65535)medium_col MEDIUMINT,...

基于AI技术的高速公路交通引流系统设计与应用研究

基于AI技术的高速公路交通引流系统设计与应用研究 1. 研究背景与意义 1.1 交通系统演化脉络 1.1.1 发展阶段划分 机械化时代&#xff08;1950-1990&#xff09;&#xff1a;固定式信号控制信息化时代&#xff08;1991-2010&#xff09;&#xff1a;SCATS/SCOOT系统智能化时代…...

n8n 中文系列教程_09. 从原始需求到精准实现:n8n节点选择指南

在自动化工作流工具n8n中&#xff0c;正确选择和使用节点是高效实现需求的关键。本文将从需求分析入手&#xff0c;逐步解析触发节点与执行节点的区别&#xff0c;梳理n8n的节点分类逻辑&#xff0c;并揭示外部服务节点的本质&#xff0c;帮助您精准匹配需求与实现方案。无论您…...

P19:Inception v1算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、模型结构 Inception V1 的主要特点是在一个网络中同时使用不同大小的卷积核&#xff08;1x1、3x3、5x5&#xff09;和池化操作来提取多尺度特征。以下是…...

day32 学习笔记

文章目录 前言一、霍夫变换二、标准霍夫变换三、统计概率霍夫变换四、霍夫圆变换 前言 通过今天的学习&#xff0c;我掌握了霍夫变换的基本原本原理及其在OpenCV中的应用方法 一、霍夫变换 霍夫变换是图像处理中的常用技术&#xff0c;主要用于检测图像中的直线&#xff0c;圆…...

2025时间序列都有哪些创新点可做——总结篇

作为AI和数据科学的核心方向之一&#xff0c;时间序列在2025年依然保持着强劲的发展势头&#xff0c;稳站各大顶会顶刊投稿主题前列。 关于它的研究&#xff0c;目前在结合传统统计方法和深度学习的基础上&#xff0c;已延伸至频域等数理工具与神经网络的交叉创新。同时针对垂…...

头歌实训之索引

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…...