STL——vector
目录
1 vector介绍
2 vector使用
2.1 vector的定义
2.1.1 无参构造
2.1.2 构造并初始化N个Val
2.1.3 拷贝构造
2.1.4 使用迭代器初始化构造
2.1.5 使用大括号初始化构造
2.2 vector的迭代器
2.2.1 const 迭代器
2.3 vector的空间增长
2.4 vector的增删改查
2.5 vector的迭代器失效(重点)
2.5.1 会引起其底层空间改变的操作,都有可能是迭代器失效
2.5.2 erase引起的迭代器失效
3 vector访问
3.1 下标法
3.2 迭代器
3.3 范围for
1 vector介绍
- STL库中的vector需要引入头文件:
#include <vector>
- 类模板原型:
template < class T, class Alloc = allocator<T> > class vector; // generic template
模板参数
- T:元素的类型
- Alloc:vector底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第二个参数
2 vector使用
2.1 vector的定义
2.1.1 无参构造
vector();vector<int> v; //定义了一个名为a的一维数组,数组存储int类型数据
2.1.2 构造并初始化N个Val
vector(size_t n, const T& val = T())vector<int> v(n); //定义一个长度为n的数组,初始值默认为0,下标范围[0, n - 1]
vector<int> v(n, 10); //v[0] 到 v[n - 1]所有的元素初始值均为10
vector<Test> v(n); //定义一个长度为n的数组,将调用Test的构造函数初始化,下标范围[0, n - 1]
模板参数:
- n:初始容器大小
- val:对于内置类型,会进行默认初始化,对于自定义类型,会调用相对应的构造函数进行初始化
2.1.3 拷贝构造
vector (const vector& x);vector<int> v1(10);
vector<int> v2(v1); //两个数组中的类型必须相同,v1和v2都是长度为10,初始值都为0的数组
2.1.4 使用迭代器初始化构造
类模板的成员函数,也可以是一个函数模板。这样设计的好处在于不限于只使用vector的容量进行初始化,还可以使用其他容器进行初始化。比如:list、string、deque等
template <class InputIterator>
vector (InputIterator first, InputIterator last);vector<int> v1;
list<int> l1;
deque<int> d1; vector<int> v2(v1.begin(),v1.end());
vector<int> v3(l1.begin(),l1.end());
vector<int> v4(d1.begin(),d1.end());
2.1.5 使用大括号初始化构造
vector (initializer_list<T> il);
首先要明确,这种初始化方式只支持C++11以后的标准
initializer_list是C++11新加入的一种容量,这个容器支持迭代器访问。它的原理与使用大括号创建数组很相似cplusplus.com/reference/initializer_list/initializer_list/
auto il = {1,2,3,4,5};
int arr[] = {1,2,3,4,5};//vector使用大括号初始化的原理就是,先将其转化为initializer_list容器,然后调用相应的构造函数进行初始化
vector<int> v{1, 2, 3, 4, 5}; //数组v中有五个元素,数组长度就为5
2.2 vector的迭代器
迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装
接口 | 时间复杂度 | 接口说明 |
begin() | O(1) | 获取第一个数据位置的iterator/const_iterator |
end() | O(1) | 获取最后一个数据的下一个位置的iterator/const_iterator |
rbegin() | O(1) | 获取最后一个数据位置的reverse_iterator |
rend() | O(1) | 获取第一个数据前一个位置的reverse_iterator |
注意:
- end() 返回的是最后一个元素的后一个位置的地址,不是最后一个元素的地址,所有STL容器均是如此
vector<int> v{1,2,3,4,5,6,7,8,9};
for(auto it = v.begin(); it != v.end(); it++)
{ cout << *it << endl;
} for(auto it = v.rbegin(); it != v.rend(); it++)
{ cout << *it << endl;
}
2.2.1 const 迭代器
当我们想创建被const修饰的vector容器迭代器时,不可以直接在迭代器前加const
vector<int> v;
const vector<int>::iterator it = v.begin();
以上的写法是不可以的,他不能达到it所指向的内容不能被修改,实际是it它本身不可以被修改
它会转换为:
int* const it = v.begin();
示例:
int main()
{vector<int> v;v.push_back(1);cout << *v.begin() << endl;const vector<int>::iterator it = v.begin();*it = 2;cout << *v.begin() << endl;return 0;
}
因此这里需要使用 const_iterator,const_iterator 就是 const T* 的重定义
typedef const T* const_iterator;vector<int> ::const_iterator it2 = v.begin();
*it2 = 2;
此时的迭代器就是指向的内容不可以被改变
2.3 vector的空间增长
接口 | 时间复杂度 | 接口说明 |
size() | O(1) | 获取数据个数 |
capacity() | O(1) | 获取容量大小 |
empty() | O(1) | 判断是否为空 |
resize() | O(N) | 改变容量的数据个数 |
reserve() | O(N) | 改变容量的容量大小 |
resize的增长逻辑:
- 小于当前容器元素个数:删除至n个元素
- 大于当前容器元素个数,小于当前容器容量:填充指定元素
- 大于当前容器容量:扩容至n个元素,并且填充指定元素
reserver的增长逻辑(不同平台会有差异):
- 大于当前容量就扩容
- 小于当前容量默认不改变容量
2.4 vector的增删改查
接口 | 时间复杂度 | 接口说明 |
push_back() | O(1) | 尾插 |
pop_back() | O(1) | 尾删 |
insert() | O(N) | 指定位置前插入 |
erase() | O(N) | 指定位置删除 |
swap() | O(1) | 交换两个容器的数据空间 |
operator[] | O(1) | 像数组一样访问 |
2.5 vector的迭代器失效(重点)
迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃)
2.5.1 会引起其底层空间改变的操作,都有可能是迭代器失效
比如:resize、reserve、insert、assign、push_back等
int main()
{vector<int> v1(10, 1);//迭代器auto it = v1.begin();//将有效元素个数增加到1000个,多出的位置使用1填充,操作期间底层会扩容v1.resize(1000, 1);//此处导致非法访问cout << *it << endl;return 0;
}
出错原因:
以上操作,都有可能会导致vector扩容,也就是说vector底层原理旧空间被释放掉,而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,实际操作的是一块已经被释放的空间,而引起代码运行时崩溃
解决方式:
在以上操作完成之后,如果想要继续通过迭代器操作vector中的元素,只需给it重新赋值即可
2.5.2 erase引起的迭代器失效
int main()
{vector<int> v1(10, 1);//迭代器auto it = v1.begin();//删除指定位置的元素v1.erase(it);//此处导致非法访问cout << *it << endl;return 0;
}
出错原因:
erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代器不应该会失效
但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是没有元素的,那么pos就失效了
我们不能依赖于某种特定的结果,因此删除vector中任意位置上元素时,默认认为该位置迭代器失效了
解决方式:
erase设有返回值,返回的是删除元素的下一个元素位置,再次给it重新赋值即可
3 vector访问
3.1 下标法
vector容器对 [] 运算符进行了函数重载,因此可以使得vector的访问可以于普通数组一样访问
int main()
{vector<int> v{1,2,3,4,5};for(int i=0;i<v.size();i++){cout<<v[i]<<" "; }return 0;
}
3.2 迭代器
与类似指针,迭代器就是充当指针的作用
int main()
{vector<int> v{1,2,3,4,5};//获取迭代器auto it=v.begin();while(it!=v.end()){cout<<*it<<" "; it++; }return 0;
}
3.3 范围for
这是C++的一个语法糖,其用法的本质就是将其替换为迭代器的形式进行访问
int main()
{vector<int> v{1,2,3,4,5};for(auto e:v){cout<<e<<" "; }return 0;
}
相关文章:
STL——vector
目录 1 vector介绍 2 vector使用 2.1 vector的定义 2.1.1 无参构造 2.1.2 构造并初始化N个Val 2.1.3 拷贝构造 2.1.4 使用迭代器初始化构造 2.1.5 使用大括号初始化构造 2.2 vector的迭代器 2.2.1 const 迭代器 2.3 vector的空间增长 2.4 vector的增删改查 2.5 ve…...
国内首款载重1吨级无人运输机TP1000首飞成功 2026年投入应急救援
大湾区经济网珠海快讯,据央视新闻报道,3月15日上午,国内首款载重1吨级大型无人运输机TP1000在山东成功首飞。该机由中国民航适航标准完全自主研发,起飞重量3.3吨,满载航程达1000公里,具备智能空投功能&…...
python-leetcode 54.全排列
题目: 给定不含重复数字的数组nums,返回其所有可能的全排列,可以按任意顺序返回答案 回溯法 一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通…...
人工智能实现电脑任务自动化的开源软件
人工智能实现电脑任务自动化的开源软件 hallo大家好,我是星哥,今天给大家介绍一个开源软件,融合了人工智能与机器人流程自动化(AIRPA)的开源软件autoMate! autoMate是什么 autoMate 是一款由开源开发的本地自动化工…...
串口烧录出现频繁回复乱码 频繁回复一个数字且烧录失败 字节混乱
这是因为你的芯片没有处于系统存储区启动一直未进入bootloader 解决办法是检查boot引脚接正确没,要在系统存储器启动...
ens33没有分配到IPV4问题
方法一:手动为 ens33 接口分配 IP 地址 你能够借助 ip 命令手动给 ens33 接口分配 IP 地址。不过这种方式在系统重启之后就会失效。 步骤 查看网络信息 先查看一下当前网络的子网信息,例如网关地址和子网掩码等,你可以通过路由器管理界面或…...
搭建主从服务器
任务需求 客户端通过访问 www.nihao.com 后,能够通过 dns 域名解析,访问到 nginx 服务中由 nfs 共享的首页文件,内容为:Very good, you have successfully set up the system. 各个主机能够实现时间同步,并且都开启防…...
【实测闭坑】LazyGraphRAG利用本地ollama提供Embedding model服务和火山引擎的deepseek API构建本地知识库
LazyGraphRAG 2024年4月,为解决传统RAG在全局性的查询总结任务上表现不佳,微软多部门联合提出Project GraphRAG(大模型驱动的KG);2024年7月,微软正式开源GraphRAG项目,引起极大关注,…...
[Lc14_priority_queue] 最后一块石头重量 | 数据流中的第 K 大元素 | 前K个高频单词 | 数据流的中位数
目录 1.最后一块石头的重量 题解 2.数据流中的第 K 大元素 题解 3.前K个高频单词 题解 代码 ⭕4.数据流的中位数 题解 在C中,使用标准库中的priority_queue,默认情况下它是一个最大堆(即大堆排序),这意味着最…...
Electron使用WebAssembly实现CRC-16 MAXIM校验
Electron使用WebAssembly实现CRC-16 MAXIM校验 将C/C语言代码,经由WebAssembly编译为库函数,可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-16 MAXIM格式校验的方式。 CRC-16 MAXIM校验函数WebAssembly源文件 C语言实…...
案例5_1:单位数码管显示0
文章目录 文章介绍效果图仿真图5_1放置单位数码管 代码5_1.c 文章介绍 效果图 仿真图5_1 复制案例1_2的仿真图,在此基础上修改 注意:栅格大小需要缩小 放置单位数码管 代码5_1.c #include <reg52.h>#define uchar unsigned char #define uint un…...
OpenCV计算摄影学(20)非真实感渲染之增强图像的细节函数detailEnhance()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 此滤波器增强特定图像的细节。 cv::detailEnhance用于增强图像的细节,通过结合空间域和频率域的处理,提升图像中特定细节…...
linux按照nginx
第一步先按照依赖gcc 一键安装上面四个依赖 Nginx的编译安装需要一些依赖库,如gcc、make、zlib、openssl等。可以使用yum命令安装这些依赖: yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 创建目录 mkdir /usr/nginx 切换…...
SpringMVC(八)Knife4j 接口文档
目录 一 基础使用 1 配置pom.xml相关依赖 2 项目配置 3 输入指定路径(http://localhost:8080/doc.html) 二 一些使用方法 1 Tag 2 Operation 3 Schema 4 Parameter 5 可以根据需求来设置 补充:日期的格式化 Knife4j 是基于 Swag…...
Java集成MQTT和Kafka实现稳定、可靠、高性能的物联网消息处理系统
Java集成MQTT和Kafka实现高可用方案 1. 概述 在物联网(IoT)和分布式系统中,消息传递的可靠性和高可用性至关重要。本文将详细介绍如何使用Java集成MQTT和Kafka来构建一个高可用的消息处理系统。 MQTT(消息队列遥测传输)是一种轻量级的发布/订阅协议,适用于资源受限的设备和…...
【操作系统安全】任务6:Linux 系统文件与文件系统安全 学习指南
目录 一、文件系统基础概念 二、查看文件系统信息 2.1 磁盘空间查看 2.2 分区与挂载管理 2.3 文件系统类型操作 三、文件系统权限配置 3.1 基础权限管理 3.2 所有权管理 3.3 特殊权限设置 四、文件操作基础 4.1 文件创建 4.2 文件删除 4.3 文件复制与移动 4.4 文件…...
华为中小型企业项目案例
实验目的(1) 熟悉华为交换机和路由器的应用场景 (2) 掌握华为交换机和路由器的配置方法 实验拓扑实验拓扑如图所示。 华为中小型企业项目案例拓扑图 实验配置市场部和技术部的配置创建VLANLSW1的配置 [LSW1]vlan batch 10 20 [LSW1]q…...
Zabbix安装(保姆级教程)
Zabbix 是一款开源的企业级监控解决方案,能够监控网络的多个参数以及服务器、虚拟机、应用程序、服务、数据库、网站和云的健康状况和完整性。它提供了灵活的通知机制,允许用户为几乎任何事件配置基于电子邮件的告警,从而能够快速响应服务器问题。Zabbix 基于存储的数据提供…...
JDBC数据库连接池技术详解——从传统连接方式到高效连接管理
1. 引言 在开发数据库应用时,我们通常需要与数据库建立连接并执行SQL语句。传统的JDBC连接方式虽然简单直接,但在高并发场景下容易带来性能问题,甚至导致系统崩溃。因此,引入数据库连接池(Connection Pool)…...
微服务存在的问题及解决方案
微服务存在的问题及解决方案 1. 存在问题 1.1 接口拖慢 因为一个接口在并发时,正好执行时长又比较长,那么当前这个接口占用过多的 Tomcat 连接,导致其他接口无法即时获取到 Tomcat 连接来完成请求,导致接口拖慢,甚至…...
C语言中的结构体数组
一、什么是结构体数组? 在C语言中,**结构体(struct)**是一种自定义数据类型,它可以将不同类型的数据组合成一个单一的数据结构。结构体数组则是多个结构体元素按顺序存储在内存中的集合。通过结构体数组,可以存储多个相同类型的结构体,每个结构体都拥有自己独立的成员变…...
[GESP 202412 一级 T1] 温度转换
描述 小杨最近学习了开尔文温度、摄氏温度和华氏温度的转换。令符号 KK 表示开尔文温度,符号 CC 表示摄氏温度,符号 FF 表示华氏温度,这三者的转换公式如下: C K - 273.15 F C*1.8 32 现在小杨想编写一个程序计算某一开尔文…...
虚幻基础:GAS
文章目录 Gameplay Tag:项目类:可直接按标签管理游戏中的各种对象。其他:数据表格:gameplaytag primary data asset:项目类:存储游戏中的数据:通常用于配置表蓝图:primary data asse…...
案例:图书管理
掌握图书管理案例的实现,能够使用Spring Boot整合Thymeleaf完成图书管理案例。 1.任务需求 (1)项目使用Spring Boot整合Thymeleaf,项目展示的页面效果全部通过Thymeleaf的模板文件实现。 (2)查询所有图书。…...
Pycharm 社区版安装教程
找到安装包双击安装文件---点击下一步 一般路径是:C:\Rambo\Software\Development 选择完成后就是如下地址: C:\Rambo\Software\Development\PyCharm Community Edition 2024.3.3 点击上述3个位置就可以了----下一步 等待安装就可以了---完成后点击完成…...
RabbitMQ 全面详解(附面试重点)
RabbitMQ 全面详解(附面试重点) 一、RabbitMQ 与其他消息队列对比 特性RabbitMQKafkaRocketMQActiveMQ设计定位企业级消息中间件(传统业务场景)高吞吐分布式流处理平台(日志、大数据)金融级高可靠消息中间…...
浏览器好用的去广告插件和暗黑模式护眼插件
提升浏览体验:Edge浏览器的Adblock和Dark Mode扩展 Adblock:告别广告干扰 功能:高效拦截弹窗、横幅和视频广告,提升网页整洁度,加快加载速度,节省流量。安装链接:安装Adblock Dark Mode for E…...
VBA第二十七期 数据录入中验证格式有效性
Excel的数据有效性验证是一个有用的工具,但会需要我们向使用数据单元格提前设定有效性验证规则。这样一来使数据的有效性验证功能不能使用在VBA编程中。下面介绍如何在工作表中使用Change事件来创建数据有效性验证过程。监视单元格区域验证数据输入的有效性…...
基于 Verilog 的时序设计:从理论到实践的深度探索
在数字电路设计领域,时序设计是一个至关重要的环节,它涉及到组合逻辑电路与时序逻辑电路的设计差异、时钟信号的运用以及触发器的工作原理等多个方面。本文将围绕基于 Verilog 的时序设计实验展开,详细阐述实验过程、代码实现以及结果分析,帮助读者深入理解时序设计的核心概…...
[JAVASE] 反射
一. 反射概念 反射(Reflection)允许程序在运行时查询、访问和修改类、接口、字段和方法的信息。反射提供了一种动态操作类的能力。 二. Java反射的基本使用和应用 java.lang.reflect 是 Java 反射机制的核心包 ,提供了操作类及其成员&…...
C++11智能指针简述
一、实现原理 在智能指针对象中有一个裸指针,此指针存储的是动态创建对象的地址,用于生存期控制,能够确保智能指针对象离开所在作用域时,自动正确地销毁动态创建的对象,防止内存泄漏。 使用裸指针存在的问题ÿ…...
【spring boot 实现图片验证码 前后端】
导入hutool依赖 <!--hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.36</version>获取验证码接口 Autowiredprivate Captcha captcha;private final static Long VALIDA…...
QT中读取QSetting文件
1.ini文件的格式 头文件 #include <QSettings> #include <QStringList> #include <QtCore> #include <QDebug>2.读文件 //ini文件的读取 void iniTest::readIniFile(QString filePath) {//1.打开ini文件QSettings m_iniFile(filePath, QSettings::I…...
网络安全 --- 基于网络安全的 Linux 最敏感目录及文件利用指南
目录 基于网络安全的 Linux 最敏感目录及文件利用指南 Linux 中最敏感的目录及文件 1. /etc 2. /root 3. /var/log 4. /proc 5. /tmp 6. /home 7. /boot 8. /dev 如何利用这些敏感文件 你可能没想到的知识点 总结 Linux 中最敏感的目录及文件 1. /etc 存放内容&a…...
操作系统八股文整理(一)
操作系统八股文整理 一、进程和线程的区别二、进程与线程的切换过程一、进程切换进程切换的步骤: 二、线程切换线程切换的步骤: 三、进程切换与线程切换的对比四、上下文切换的优化 三、系统调用一、系统调用的触发二、从用户空间切换到内核空间三、执行…...
ssh转发笔记
工作中又学到了,大脑转不过来 现有主机A,主机B,主机C A能访问B,B能访问C,A不能访问C C上80端口有个服务,现在A想访问这个服务,领导让用ssh转发,研究半天没找到理想的语句…...
[从零开始学SSM] Bean的配置
bean基础配置 bean别名配置 bean的作用范围配置 由运行结果可知,Spring创建的bean默认是单例的 那么如果我想创建非单例的bean怎么办,这时候就需要用到配置的方式完成了:在<bean>的属性中添加一个scope属性,该属性默认是si…...
CML(Current Mode Logic)电平详解
一、CML的定义与核心特性 CML(Current Mode Logic,电流模式逻辑) 是一种基于 电流驱动 的高速差分信号标准,专为 10Gbps以上超高速传输 设计。其核心原理是通过恒定的尾电流源切换电流路径,生成低摆幅差分信号&#x…...
【链表世界的深度探索:从基础到高阶的算法解读】—— LeetCode
文章目录 反转链表链表的中间结点合并两个有序链表相交链表两数相加两两交换链表中的节点重排链表合并K个升序链表K个一组翻转链表 反转链表 这道题目的意思很好理解,即将链表给反转即可 方法一: 利用双指针进行操作,定义两个变量 prev 以及…...
JMeter 性能测试
Jmeter 用户手册 名词解释: RPS:每秒请求数-每秒向服务器发送多少请求数(一个场景,系统面临多大的压力) TPS:每秒事务数-每秒能够处理多少请求/事务数性能评价标准(其中的一个核心指标&#x…...
LCR 159. 库存管理 III
这道题虽然简单,但是可以有多种解法,适合练习各种解法。 可以用基于快速排序思想的快速选择算法: class Solution { public:vector<int> inventoryManagement(vector<int>& stock, int cnt) {vector<int> res;int le…...
Spring IOC(五个类注解)
controller、service、Repository、Component 、Configurationpackage com.java.ioc;import com.java.ioc.Controller.HelloController; import com.java.ioc.rep.UserRepository; import com.java.ioc.service.UserService; import org.springframework.boot.SpringApplicatio…...
JavaScript 中的包装类型:概念、作用与使用场景
文章目录 引言1. 什么是包装类型?1.1 包装类型的定义1.2 包装类型的作用 2. 包装类型的使用2.1 自动装箱(Autoboxing)示例 2.2 手动创建包装对象示例 3. 包装类型的特性3.1 包装对象的生命周期示例 3.2 基本类型与包装对象的区别示例 4. 包装…...
Linux 如何上传本地文件以及下载文件到本地命令总结
如果你希望在 Shell 终端中将远程服务器上的文件下载到本地电脑,可以使用以下工具和命令: 1. rz / sz(用于 Xshell、MobaXterm 等终端) 如果你使用的是Xshell、SecureCRT、MobaXterm等支持 rz/sz 的终端,可以使用 rz …...
CentOS 上扩展 Swap 分区的大小
在 CentOS 上扩展 Swap 分区的大小可以通过以下几种方式实现: 方法 1:增加 Swap 文件(推荐) 如果你的 Swap 是基于文件的(而不是分区),你可以增加 Swap 文件的大小,而不需要修改磁盘…...
清晰易懂的Miniconda安装教程
小白也能看懂的 Miniconda 安装教程 Miniconda 是一个轻量级的 Python 环境管理工具,适合初学者快速搭建 Python 开发环境。本教程将手把手教你如何在 Windows 系统上安装 Miniconda,并配置基础环境,确保你能够顺利使用 Python 进行开发。即…...
算法016——最小覆盖子串
力扣——最小覆盖子串(点击跳转) 分析题目 我们先随便从一个位置开始,让 right 右移,直到找到符合题目的位置停下 之后,让 left 右移,此时会出现两种情况 仍然符合要求,right 不需要动不符合…...
DeepSeek-R1大模型微调技术深度解析:架构、方法与应用全解析
1. DeepSeek-R1大模型架构设计与技术特性 1.1 架构设计 DeepSeek-R1作为超大规模语言模型,其核心架构设计包含以下创新: 专家混合架构(MoE) 采用6710亿参数的混合专家架构(MoE),每个推理过程仅激活370亿参数,实现计算效率与资源利用率的突破性提升。 Transformer框架…...
二阶近似 是什么意思
二阶近似 是什么意思 一、二阶近似的概念与举例 二阶近似是数学分析中通过泰勒展开对函数进行近似的方法,保留到二阶项(即包含一阶导数和二阶导数)。在优化问题(如模型训练)中,常用于近似损失函数,帮助更精准地更新模型参数。 举例: 假设损失函数为 L ( θ ) \mathc…...
STM32U575RIT6单片机(四)
作业: 使用I2C获取SHT20传感器温湿度 使用I2C获取AP3216C三合一传感器: 光照, 接近, 红外 三个功能 合并的传感器 #ifndef SHT20_H #define SHT20_H#include "stdint.h" #include "i2c.h" #include "stdio.h" //1、确定从机的设备地址(代码不…...