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

C++vector常用接口和模拟实现

C++中的vector是一个可变容量的数组容器,它可以像数组一样使用[]进行数据的访问,但是又不像C语言数组空间是静态的,它的空间是动态可变的。

在日常中我们只需要了解常用的接口即可,不常用的接口查文档即可。

1.构造函数

//空构造
vector()//拷贝构造
vector(const vector<T>& v)//构造并初始化n个val
vector(size_t n,const T& val = T())//使用迭代器初始化,这里写成模板
template<class InputIterator>
vector(InputIterator first, InputIterator last)

2.迭代器

对于vector的迭代器也可以看作是指针

//获取第一个位置数据的普通迭代器和const迭代器
iterator begin();
const_iterator begin() const;//获取最后一个位置数据的普通迭代器和const迭代器
iterator end();
const_iterator end() const;

3.空间管理

//获取元素个数
size_t size() const;//判断是否为空
bool empty() const;//改变大小并且初始化
void resize (size_type n, value_type val = value_type());//改变容量
void reserve (size_type n);

reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问 题。 resize在开空间的同时还会进行初始化,影响size。

4.增删改查

//尾插
void push_back (const value_type& val);//尾删
void pop_back();//在任意位置插入
iterator insert (iterator position, const value_type& val);//在任意位置删除
iterator erase (iterator position);//交换两组数据空间
void swap (vector& x);//[]重载
T& operator[](size_t pos)

这里需要了解一个问题就是迭代器失效的问题,对于vector而言,它的迭代器底层就是原生指针。因此迭代器失效的原因就是指针所指向的空间被销毁了,指向了一个已经被释放的空间。

    vector<int> v{1,2,3,4,5,6};auto it = v.begin();// 将有效元素个数增加到100个,多出的位置使用8填充,操作期间底层会扩容// v.resize(100, 8);// reserve的作用就是改变扩容大小但不改变有效元素个数,操作期间可能会引起底层容量改变// v.reserve(100);// 插入元素期间,可能会引起扩容,而导致原空间被释放// v.insert(v.begin(), 0);// v.push_back(8);

例如上面这些例子,他们都引起了底层空间的改变,就会导致it失效,如果在后面的代码中使用失效的迭代器就会导致程序崩溃。

要解决这个问题的方法也很简单,就是在修改之后重新赋值即可。

下面进行vector的模拟实现

	template<class T>class vector{public://vector的迭代器就是原生指针,这里写成模板的形式typedef T* iterator;typedef const T* const_iterator;//begin()相当于直接返回头指针iterator begin(){return _start;}const_iterator begin() const{return _start;}//end()相当于直接返回尾指针iterator end(){return _finish;}const_iterator end() const{return _finish;}//左闭右开//迭代器构造函数,这里写成模板支持更多类型template<class InputIterator>vector(InputIterator first, InputIterator last){while(first != last){push_back(*first);++first;}}//空构造函数vector():_start(nullptr), _finish(nullptr), _endofstorage(nullptr){}//拷贝构造//不能使用memcpy,因为这是浅拷贝,很可能会造成内存泄漏vector(const vector<T>& v):_start(nullptr), _finish(nullptr), _endofstorage(nullptr){_start = new T[v.capacity()];//memcpy(_start, v._start, sizeof(T) * v.size());//这里与下面reserve是相同的问题for (size_t i = 0; i < v.size(); i++){_start[i] = v._start[i];//如果是自定义类型,这里事实上调用的是自定义类型的赋值操作}//这里由于是原生指针,并且是顺序存储因此可以直接相加_finish = _start + v.size();_endofstorage = _start + v.capacity();}//初始化n个val的vector,这里可以复用resize()vector(size_t n,const T& val = T()):_start(nullptr), _finish(nullptr), _endofstorage(nullptr){resize(n, val);}//交换void swap(vector<T>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endofstorage, v._endofstorage);}//现代写法//这里使用传值方式传参是因为能够生成临时拷贝不会影响原数据//这里使用传引用返回是因为this出了作用域会销毁vector<T>& operator=(vector<T> v){swap(v);//相当于this->swap(v)return *this;}//析构~vector(){if (_start){delete[] _start;_start = _finish = _endofstorage = nullptr;}}//reserve()空间管理,同样不能使用memcpy(),会导致内存泄漏void reserve(size_t n){if (n > capacity()){size_t sz = size();T* temp = new T[n];if (_start){//memcpy(temp, _start, sizeof(T) * size());for (size_t i = 0; i < sz; i++){temp[i] = _start[i];//如果是自定义类型,这里事实上调用的是自定义类型的赋值操作}delete[] _start;}_start = temp;//_finish = _start + size()这样写是错的。//由于_start的改变会导致size()报错,这就是迭代器失效。//因为_start指向了新空间,但是_finish还是指向旧空间_finish = _start + sz;_endofstorage = _start + n;}}//申请n个空间初始化为val,这里复用reserve()void resize(size_t n,const T& val = T())//匿名对象{if (n < size()){_finish = _start + n;}else{reserve(n);while (_finish != _start + n){*_finish = val;++_finish;}}}//尾插,这里自己实现需要注意扩容,但是也可以考虑直接复用insert()void push_back(const T& x){//if (_finish == _endofstorage) //{//	//扩容//	size_t newcapacity = capacity() == 0 ? 4 : capacity() *2;//	reserve(newcapacity);//}//*_finish = x;//++_finish;insert(end(), x);}//这里与尾插是一样的思路void pop_back(){erase(end());}//获得当前容器的容量size_t capacity() const{return _endofstorage - _start;}//获取当前容器中有效数据的个数size_t size() const{return _finish - _start;}//重载[],这里事实上相当于(*_start + pos)T& operator[](size_t pos){assert(pos < size());return _start[pos];}const T& operator[](size_t pos) const{assert(pos < size());return _start[pos];}//任意位置插入,需要注意迭代器失效的问题void insert(iterator pos ,const T& x){assert(pos >= _start && pos <= _finish);if (_finish == _endofstorage){//扩容//这里如果直接扩容会引发迭代器失效,因为pos还是指向原来的位置//因此需要更新pos的位置,这里保存的时相对位置size_t len = pos - _start;size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;reserve(newcapacity);pos = _start + len;}iterator end = _finish - 1;while (end >= pos){*(end + 1) = *end;end--;}*pos = x;++_finish;}//iterator erase(iterator pos)//{//	 //检查 pos 是否在合法范围内//	if (pos < _start || pos >= _finish)//	{//		throw std::out_of_range("Iterator out of range");//	}//	 //从删除位置开始,将后续所有元素向前移动一位//	iterator it = pos;//	while (it < _finish - 1)//	{//		*it = *(it + 1);//		++it;//	}//	 //更新 _finish,减少容器大小//	--_finish;//	 //返回删除位置的下一个有效迭代器//	return pos;  // 注意:这里返回的是删除位置的下一个迭代器//}//只要把pos位置后面的元素向前挪动覆盖即可,也不需要考虑迭代器失效的问题iterator erase(iterator pos){assert(pos >= _start && pos <= _finish);iterator it = pos + 1;while (it != _finish){*(it - 1) = *it;++it;}--_finish;return pos;}private://定义头指针和尾指针以及一个管理空间的指针iterator _start;iterator _finish;iterator _endofstorage;};

相关文章:

C++vector常用接口和模拟实现

C中的vector是一个可变容量的数组容器&#xff0c;它可以像数组一样使用[]进行数据的访问&#xff0c;但是又不像C语言数组空间是静态的&#xff0c;它的空间是动态可变的。 在日常中我们只需要了解常用的接口即可&#xff0c;不常用的接口查文档即可。 1.构造函数 //空构造…...

AI数据分析:一键生成数据分析报告

作为一名数据分析师&#xff0c;我们经常需要做一些数据分析报告&#xff0c;今天我就来手把手教你如何使用大模型一键生成高质量的数据分析报告&#xff0c;提高你的工作效率。 假设你是一家新零售企业的销售分析师&#xff0c;有一份销售数据&#xff0c;数据结构如数据结构…...

leetcode 2829. k-avoiding 数组的最小总和 中等

给你两个整数 n 和 k 。 对于一个由 不同 正整数组成的数组&#xff0c;如果其中不存在任何求和等于 k 的不同元素对&#xff0c;则称其为 k-avoiding 数组。 返回长度为 n 的 k-avoiding 数组的可能的最小总和。 示例 1&#xff1a; 输入&#xff1a;n 5, k 4 输出&…...

微信小程序登录和获取手机号

目录 准备工作 实现流程 实现代码 公共部分 通过code获取openid等信息 解密手机号 扩展 不借助工具类实现解密 借助工具类获取access_token 准备工作 需要小程序账号&#xff08;可以去微信公众平台创建一个测试号或者正式号&#xff09; appid&#xff1a;小程序id …...

漫画|基于SprinBoot+vue的漫画网站(源码+数据库+文档)

漫画网站 目录 基于SprinBootvue的漫画网站 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…...

华鲲振宇天工TG225 B1国产服务器试装openEuler22.03 -SP4系统

今天测试了一下在华鲲振宇公司的天工TG225 B1国产服务器上进行openEuler22.03 -SP4操作系统的试装&#xff0c;本文记录整个测试过程。 一、服务器信息 1、服务器型号 Huakun TG225 B1 (D) 2、登录IPMI帐户信息 初始用户名Tech.ON 密码TianGong8000 二、磁盘RAID配置 测试…...

Graphpad Prism for Mac医学绘图

Graphpad Prism for Mac医学绘图 文章目录 Graphpad Prism for Mac医学绘图一、介绍二、效果三、下载 一、介绍 GraphPad Prism for Mac是一款功能强大、易于使用的科学和统计分析软件&#xff0c;适用于各种类型的数据处理和可视化需求。无论您是进行基础研究、临床试验还是学…...

单多表查询练习

课堂代码练习 mysql> select * from t_heros; ----------------------------- | id | name | books | ----------------------------- | 1 | 孙悟空 | 西游记 | | 2 | 猪八戒 | 西游记 | | 3 | 林黛玉 | 红楼梦 | | 4 | 贾宝玉…...

SICAR标准 汽车焊装生产线触摸屏操作说明

目录 SIMATIC HMI 是西门子工业自动化解决方案的核心组件&#xff0c;支持实时设备监控与交互&#xff0c;文档中展示了其在焊装生产线中以SICAR标准为基础的具体应用&#xff0c;包括车型切换&#xff08;如 AY2/A26&#xff09;、KMC 夹具配置及能源效率分析&#xff0c;适用…...

Photoshop 2025安装教程包含下载安装包,2025最新版图文安装教程

文章目录 前言一、Photoshop 2025下载二、Photoshop 2025安装教程1. 安装包解压2. 找到安装程序3. 以管理员身份运行4. 安装选项设置5. 选择安装路径6. 开始安装7. 安装完成8. 启动软件9. 软件主界面 前言 无论你是专业设计师&#xff0c;还是刚接触图像处理的新手&#xff0c…...

SylixOS 中 select 原理及使用分析

1、select接口简介 1.1 select接口使用用例 select 是操作系统多路 I/O 复用技术实现的方式之一。 select 函数允许程序监视多个文件描述符&#xff0c;等待所监视的一个或者多个文件描述符变为“准备好”的状态。所谓的”准备好“状态是指&#xff1a;文件描述符不再是阻塞状…...

F1C200S编译

一、查看荔枝派Nano的分区内容 分成了两个分区 将第一个分区通过mount进行挂载&#xff0c;查看到内容包括&#xff1a;主要是dtb设备树和zImage压缩的内核。由于u-boot不是是通过dd指令传输到指定的位置&#xff0c;因此这里不显示。还有一个scr&#xff0c;这是一个uboot启动…...

边缘计算 vs. 云计算,谁才是工业物联网的未来?

前言 在物联网&#xff08;IoT&#xff09;飞速发展的今天&#xff0c;边缘计算正在彻底改变数据的处理、存储和分析方式。传统的IoT设备数据通常需要发送到云端进行处理&#xff0c;但随着设备数量的激增&#xff0c;这种模式在延迟、带宽和安全性方面暴露出诸多局限。边缘计…...

vue 使用v-model实现父子组件传值——子父组件同步更新

基于vue2和vue3两个版本的框架略显不同&#xff0c;所以我分开的来讲&#xff1a; 1、vue2 子组件&#xff08;my-input.vue&#xff09;&#xff1a; <template><input type"text" :value"name" input"inputChange" /> </tem…...

监控易运维在北京某医药集团数字新基建项目中的应用

随着信息技术的快速发展&#xff0c;企业数字化转型已成为当今时代的趋势。北京某医药公司作为一家知名的中医药企业&#xff0c;也在积极推进数字化建设。在数字新基建招标项目中&#xff0c;监控易管理平台 6.0 凭借其强大的功能和特点&#xff0c;成功中标&#xff0c;为医药…...

小智AI音频开发 libopus + Eclipse C/C++ MinGW 编解码测试用例

小智AI音频开发 libopus Eclipse C/C MinGW 编解码测试用例 目录 小智AI音频开发 libopus Eclipse C/C MinGW 编解码测试用例前言移植编解码测试libopus编码器的控制参数信号类型比特率带宽编码复杂度前向纠错声道不连续传输位深帧持续时长码率VBR约束应用类型 示例代码 前言…...

Spring Boot定时任务设置与实现

Spring Boot定时任务设置与实现 在Spring Boot中&#xff0c;可以使用Scheduled注解来创建定时任务。以下是一个简单的示例&#xff0c;展示了如何在项目启动后每5秒调用一次指定的方法。 1. 添加依赖 首先&#xff0c;确保你的pom.xml文件中包含Spring Boot的依赖&#xff…...

海康/大华/宇视/华为/汉邦/天地伟业/英飞拓/科达/中星微/同为/天视通等主流监控设备RTSP地址

RTSP协议是TCP/IP协议体系中的一个应用层协议&#xff0c;该协议主要规定了一对多应用程序如何有效地通过IP网络传送多媒体数据&#xff0c;特别适用于音视频数据的实时传输和控制。 目前监控市场厂家众多&#xff0c;各个厂家的RTSP地址格式不尽一致 以下是海康威视、大华股份…...

FreeRTOS 队列结构体 xQUEUE 深度解析

一、核心成员与功能设计 FreeRTOS 的队列结构体 xQUEUE 是任务间通信&#xff08;IPC&#xff09;的核心数据结构&#xff0c;通过统一的设计支持队列、信号量、互斥量等多种同步机制。其设计体现了 ​**"数据拷贝 结构复用"** 的理念&#xff0c;兼顾轻量化与扩展…...

system V 消息队列信息量(了解)

目录 system V 消息队列 消息队列的基本原理 消息队列数据结构 消息队列接口介绍 消息队列相关函数 消息队列的释放 向消息队列发送数据 向消息队列接收消息 System V 信号量 信号量相关概念 信号量的数据结构 信号量相关函数 进程互斥 system V IPC联系 system V…...

CSS rem、vw/vh、less

目录 分辨率、视口与二倍图 一、分辨率与像素基础 1. 物理像素&#xff08;Physical Pixels&#xff09; 2. 逻辑像素&#xff08;CSS 像素&#xff09; 二、视口&#xff08;Viewport&#xff09;控制 1. 视口类型 2. 设置理想视口 三、二倍图&#xff08;Retina/HiD…...

CHI协议——retry

一、核心目标 防止请求阻塞&#xff1a;当Completer暂时无法处理请求(比如tracker不够被占满)时&#xff0c;通过retry机制避免请求在 REQ Channel堆积&#xff0c;确保系统流畅运行。 retry机制只存在于REQ Channel&#xff0c;在DAT/RSP/SNP Channel不存在 二、Retry Flow…...

在linux部署网站

在Linux部署网站&#xff0c;需要准备一个纯净的系统 一、系统环境准备 1.设置静态IP地址 ‌ 2.关闭默认防火墙 systemctl disable firewalld --now ‌ 3.配置SSH密钥登录 4.yum update -y && reboot # 更新系统内核 5.yum install -y wget curl unzip # 安装…...

语义网是什么

语义网&#xff08;Semantic Web&#xff09;是由万维网发明者 蒂姆伯纳斯-李&#xff08;Tim Berners-Lee&#xff09; 在20世纪90年代末提出的概念&#xff0c;目标是让互联网上的数据不仅对人类可读&#xff0c;还能被机器自动理解、关联和推理。它通过为数据添加明确的语义…...

51单片机

本文来源&#xff1a;腾讯元宝 51单片机是对所有兼容Intel 8031指令系统的8位单片机的统称&#xff0c;其技术起源于1981年Intel推出的8051内核微控制器(Micro Control Unit)。作为嵌入式系统领域的经典代表&#xff0c;它具有以下核心特点和应用价值&#xff1a; 一、技术特…...

初2数学-1.勾股定理

复习勾股定理&#xff1a; 1. ; 2. ; 3. ; 4. 后面3个式子都是根据相似三角形对应边成比例推出来的。 第4个式子来做例子&#xff1a; 三角形CBD与三角形 ACD相似&#xff0c;所以&#xff1a; h:c2 c1 : h. 【例题] ABCD为菱形&#xff0c;边长为…...

Java条码与二维码生成技术详解

一、技术选型分析 1.1 条码生成方案 Barbecue是最成熟的Java条码库&#xff0c;支持&#xff1a; Code 128EAN-13/UPC-AUSPS Inteligent Mail等12种工业标准格式 1.2 二维码方案对比 库名称维护状态复杂度功能扩展性ZXing★★★★☆较高强QRGen★★★☆☆简单一般BoofCV★…...

Spring Boot 集成 Quartz 实现定时任务(Cron 表达式示例)

Spring Boot 集成 Quartz 实现定时任务&#xff08;Cron 表达式示例&#xff09; 前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Spring Boot 观察定时任务执行5. Quartz Cron 表达式详解6. 结论 前言 在 Spring Boot 项目中&#xff0c;我们经常…...

数智读书笔记系列025《智能医疗:医学人工智能的未来》

一、书籍概述与核心价值 1.1 书籍定位与影响力 《智能医疗:医学人工智能的未来》在智能医疗领域占据着独特且重要的位置,作为首部由德勤管理咨询引进的 AI 医疗译著,它宛如一座桥梁,连接了人工智能与生物医学这两个看似独立却又紧密关联的领域。在当下智能医疗蓬勃发展但…...

SQL Server 2022常见问题解答

以下是SQL Server 2022的常见问题解答,按主题分类整理: 一、安装与升级 SQL Server 2022的系统要求是什么? 支持的操作系统:Windows Server 2016及以上、Linux(Ubuntu 20.04/22.04, RHEL 8/9等)。内存:至少4GB(建议8GB+)。磁盘空间:6GB以上,具体取决于安装组件。如何…...

SQLAlchemy关键词搜索技术深度解析:从基础过滤到全文检索

在数据驱动的应用开发中&#xff0c;基于关键词的模糊查询是常见的业务需求。SQLAlchemy作为Python生态中最流行的ORM框架&#xff0c;提供了多种实现关键词搜索的技术方案。本文将从性能、适用场景和技术复杂度三个维度&#xff0c;系统对比分析SQLAlchemy中关键词搜索的最佳实…...

react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析

一、React 15&#xff08;2016&#xff09; 核心架构&#xff1a;Stack Reconciler&#xff08;栈协调器&#xff09; 工作原理&#xff1a; 同步递归渲染&#xff1a;采用深度优先遍历方式递归处理 Virtual DOM&#xff0c;形成不可中断的调用栈渲染流程&#xff1a;1. 触发 …...

[Windows] Edge浏览器_134.0.3124.83绿色便携增强版-集成官方Deepseek侧边栏

微软Edge浏览器 绿色便携增强版 长期更新 链接&#xff1a;https://pan.xunlei.com/s/VOMA-aVC_GPJiv-MzRS89lsVA1?pwdemxj# Edge浏览器_134.0.3124.83绿色便携增强版-集成官方Deepseek侧边栏...

STM32学习笔记之存储器映射(原理篇)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…...

探索PyMOL新插件NRGSuite-Qt:全面提升分子对接、结合位点预测与动力学模拟的研究效率

随着分子建模和计算生物学的快速发展&#xff0c;分子对接&#xff08;Molecular Docking&#xff09;、结合位点预测、相互作用分析以及动力学研究等领域的工具越来越重要。这些工具不仅帮助研究人员理解分子间的相互作用机制&#xff0c;还能加速药物设计和优化过程。NRGSuit…...

c#在work线程中怎样更新UI控件

最近笔者调试修改项目&#xff0c;碰到了c#在work线程中怎样更新UI控件中的场景&#xff0c;简单总结了下&#xff0c;主要有两个方法&#xff1a; 方法1&#xff1a;通过System.Windows.Application.Current.Dispatcher.Invoke来更新UI控件 System.Windows.Application.Curre…...

DeepSeek、Grok 与 ChatGPT 4.5:新一代大模型架构与推理能力深度解析

近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;领域发展迅猛&#xff0c;DeepSeek、Grok 以及 OpenAI 最新发布的 ChatGPT 4.5 都是该领域的代表性产品。本文将从架构设计、推理能力、训练策略等方面&#xff0c;对三者进行技术对比&#xff0c;探讨其优势与潜在的应…...

从零基础到 Java 网站项目开发学习规划​

在数字化时代&#xff0c;Java 凭借其卓越的跨平台性、强大的功能和丰富的类库&#xff0c;成为开发各类网站的主流编程语言。对于想要踏入 Java 网站开发领域的初学者而言&#xff0c;一份系统、科学的学习规划至关重要。它不仅能帮助我们有条不紊地掌握知识和技能&#xff0c…...

Unity Shader 学习17:合批渲染

一、基础概念 合批主要是针对这三个概念进行优化减少&#xff1a; ① SetPass Call&#xff1a;一次渲染状态切换&#xff0c;也就是每次切换 材质/Pass 时&#xff0c;就会触发一次SetPass Call ② Draw Call&#xff1a;cpu 调用一次 gpu 绘制函数 ③ Batch&#xff1a;表示…...

【JavaSE】抽象类和接口

【JavaSE】抽象类和接口 前言&#xff1a;补充知识 —— 利用类和对象&#xff0c;交换两个数字 一、抽象类1.1 抽象类是什么&#xff1f;1.2 抽象类特点1.3 抽象类举例1.4 抽象类作用 二、接口2.1 接口是什么&#xff1f;2.2 接口的特性2.3 接口的使用规则2.4 类可以实现多个接…...

嵌入式单片机程序的映像文件解读

映像文件类型 单片机下载程序的映像文件是包含了可执行代码、数据等信息,用于将程序烧录到单片机中的文件。常见的映像文件种类如下: 十六进制文件(Hex 文件) 格式特点:Hex 文件是一种文本格式的文件,以 ASCII 字符形式存储数据。它由一系列的记录组成,每条记录包含一个…...

在 Linux(Ubuntu / CentOS 7)上快速搭建我的世界 MineCraft 服务器,并实现远程联机,详细教程

Linux 部署 MineCraft 服务器 详细教程&#xff08;丐版&#xff0c;无需云服务器&#xff09; 一、虚拟机 Ubuntu 部署二、下载 Minecraft 服务端三、安装 JRE 21四、安装 MCS manager 面板五、搭建服务器六、本地测试连接七、下载樱花&#xff0c;实现内网穿透&#xff0c;邀…...

STL之string

1.为什么学习string类 1.1 C语言中的字符串 C语言中&#xff0c;字符串是以’\0’结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c; 但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且…...

cJSON-轻量级 C 语言 JSON 解析库的使用(一)

文章目录 cJSON&#xff1a;轻量级 C 语言 JSON 解析库的使用前言一、cJSON 简介核心特点&#xff1a; 二、核心数据结构解析三、深入解析 API 设计1. 解析 JSON2. 访问数据3. 构建 JSON 四、内存管理策略五、高级应用技巧1. 引用系统2. 批量操作3. 原地修改 六、性能优化技巧1…...

用Python和Stable Diffusion生成AI动画:从图像到视频的全流程指南

引言 本文将演示如何通过Python代码实现基于文本提示的AI动画生成。我们将使用Stable Diffusion生成连贯图像帧,结合OpenCV合成视频,最终实现一个可自定义的动画生成 pipeline。 一、环境准备 1. 依赖安装 # 安装核心库 pip install diffusers transformers torch numpy …...

C++ 继承:面向对象编程的核心概念(二)

文章目录 5. 继承与友元6. 继承与静态成员7. 多继承及其菱形继承问题7.1 不同的继承方式7.2 虚继承 8. 继承和组合9. 总结 书接上回:C 继承&#xff1a;面向对象编程的核心概念&#xff08;一&#xff09; 5. 继承与友元 友元关系不能继承&#xff0c;也就是说基类友元不能访问…...

Chaos Mesh 混沌工程平台介绍、安装及使用指南

Chaos Mesh 混沌工程平台介绍、安装及使用指南 一、Chaos Mesh 简介 Chaos Mesh 是 PingCAP 开源的云原生混沌工程平台&#xff0c;支持在 Kubernetes 环境中模拟各种故障场景&#xff0c;帮助提升系统的容错性和可恢复性。 核心特性 丰富的故障类型&#xff1a; 资源类&…...

每天五分钟深度学习框架PyTorch:梯度裁剪解决RNN梯度爆炸的问题

本文重点 在循环神经网络训练的过程中,有时候很容易出现梯度爆炸的情况,如果出现这种问题,我们应该怎么办?本文先来分析一下为什么会出现这种情况,然后我们在给出解决方案 梯度爆炸的原因 我们从RNN训练的反向传播算法入手,当我们使用BPTT算法训练RNN的时候,它的公式…...

批量删除 PDF 中的所有图片、所有二维码图片以及指定的某张图片

PDF 文档中我们可以插入图片、文字等多种类型的资源。在某些场景下&#xff0c;可能我们需要删除 PDF 文档中的图片&#xff0c;有可能是需要删除所有的图片&#xff0c;也有可能是删除固定的某些图片。那碰到这种情况&#xff0c;我们应该怎么处理呢&#xff1f;今天就给大家介…...

力扣HOT100之普通数组:53. 最大子数组和

这道题目我用贪心做的&#xff0c;感觉用贪心的思路比较简单&#xff0c;以后要是面试碰到这道题就直接用贪心好了&#xff0c;这道题用贪心的核心思想就是不断将数组元素i加入总和sum&#xff0c;如果sum比当前维护的最大值result更大&#xff0c;说明当前遍历到的i是正数&…...