STL详解 - map和set
目录
一、关联式容器概述
二、键值对
三、树形结构的关联式容器
(一)set
1. set的介绍
2. set的使用
(1)模板参数列表
(2)构造函数
(3)迭代器函数
(4)容量函数
(5)修改操作函数
(6)常用接口
(7)使用举例
(二)map
1. map的介绍
2. map的使用
(1)模板参数说明
(2)构造函数
(3)迭代器函数
(4)容量与元素访问函数
(5)元素修改函数
(6)常用接口
(7)使用示例
(三)multiset
1. multiset的介绍
2. multiset的使用
(四)multimap
1. multimap的介绍
2. multimap的使用
四、容器对比
一、关联式容器概述
在STL中,容器分为两大类别:
-
序列式容器:线性数据结构(vector/list/deque等),存储元素本身
-
关联式容器:存储<key,value>键值对,基于红黑树实现,具有高效检索特性
主要区别:
-
存储内容:键值对 vs 独立元素
-
检索效率:O(logN) vs O(N)
-
元素顺序:自动排序 vs 插入顺序
二、键值对
键值对是用来表示具有一一对应关系的一种结构,一般包含两个成员变量 key 和 value,key 代表键值,value 表示与 key 对应的信息。例如建立英汉互译字典,英文单词与其中文含义是一一对应的。
在 SGI-STL 中,键值对的定义如下:
template <class T1, class T2>
struct pair
{typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair(): first(T1()), second(T2()) {}pair(const T1& a, const T2& b): first(a), second(b) {}
};
三、树形结构的关联式容器
STL 中实现了两种不同结构的关联式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset,它们都使用平衡搜索树(红黑树)作为底层结构,容器中的元素是有序的序列。
(一)set
1. set的介绍
set文档介绍
翻译:
- set 是按照一定次序存储元素的容器。
- 在 set 中,元素的 value 也标识它(value就是 key,类型为 T),并且每个 value 必须唯一的。set 中的元素不能在容器中修改(元素总是const),但可以从容器中插入或删除它们。
- 在内部,set 中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
- set 容器通过key 访问单个元素的速度通常比 unordered_set容器慢,但它们允许按顺序对子集进行直接迭代。
- set 在底层是用二叉搜索树(红黑树)实现的。
注意:
- 与 map/multimap 不同,map/multimap 存储的是真正的键值对<key, value>,set 中只放 value,但在底层实际存放的是由<value, value>构成的键值对。
- set 中插入元素时,只需插入 value 即可,无需构造键值对。
- set 中的元素不可重复,(因此可以使用set进行去重)。
- 使用set的迭代器遍历set中的元素,可以得到有序序列。
- set中的元素默认按照小于来比较。
- set 中查找某个元素的时间复杂度为 O(log₂n)。
- set 中的元素不允许修改,因为其底层是二叉搜索树(红黑树)。
2. set的使用
(1)模板参数列表
参数名称 | 说明 |
---|---|
T | set 中存放元素的类型,底层存储 <value, value> 的键值对。 |
Compare | 比较函数对象的类型,默认根据 less<T> 按元素是否小于另一元素排序。 |
Alloc | 用于元素分配和管理空间的分配器,默认使用 STL 提供的空间配置器。 |
(2)构造函数
构造函数 | 说明 |
---|---|
set (const Compare& comp = Compare(), const Allocator& alloc = Allocator()) | 构造空的 set ,comp 用于比较,alloc 用于空间管理。 |
set (InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& alloc = Allocator()) | 使用范围 [first, last) 中的元素构造 set ,comp 和 alloc 同上。 |
set (const set<Key, Compare, Allocator>& x) | 拷贝构造,用 x 的内容初始化新 set 。 |
(3)迭代器函数
迭代器函数 | 说明 |
---|---|
begin() | 返回指向起始位置元素的迭代器。 |
end() | 返回指向最后一个元素后面位置的迭代器。 |
cbegin() | 返回指向起始位置元素的 const 迭代器。 |
cend() | 返回指向最后一个元素后面位置的 const 迭代器。 |
rbegin() | 返回指向第一个元素的反向迭代器,即指向末尾的迭代器。 |
rend() | 返回指向最后一个元素下一个位置的反向迭代器,即指向起始位置的迭代器。 |
crbegin() | 返回指向第一个元素的反向 const 迭代器,即指向 cend() 。 |
crend() | 返回指向最后一个元素下一个位置的反向 const 迭代器,即指向 cbegin() 。 |
(4)容量函数
容量函数 | 说明 |
---|---|
empty() | 检测 set 是否为空,若为空返回 true ,否则返回 false 。 |
size() | 返回 set 中有效元素的个数。 |
(5)修改操作函数
修改操作函数 | 说明 |
---|---|
insert(const value_type& x) | 插入元素 x ,实际插入的是 <x, x> 构成的键值对。若插入成功,返回包含该元素在 set 中位置和 true 的 pair ;若失败(x 已存在),返回包含 x 在 set 中位置和 false 的 pair 。 |
erase(iterator position) | 删除 position 位置上的元素。 |
erase(const key_type& x) | 删除值为 x 的元素,返回删除的元素个数。 |
erase(iterator first, iterator last) | 删除 [first, last) 区间中的元素。 |
swap(set<Key, Compare, Allocator>& st) | 交换两个 set 中的元素。 |
clear() | 清空 set 中的元素。 |
find(const key_type& x) | 返回值为 x 的元素的位置。 |
count(const key_type& x) | 返回值为 x 的元素的个数。 |
(6)常用接口
// 构造
set<int> s1; // 空set
set<int> s2(arr, arr+arrSize); // 数组构造// 插入删除
s.insert(10); // 插入元素
s.erase(20); // 删除元素// 查找
auto pos = s.find(5); // 返回迭代器
int cnt = s.count(5); // 存在返回1,否则0// 容量
bool isEmpty = s.empty();
size_t size = s.size();
(7)使用举例
#include <iostream>
#include <set>
using namespace std;int main()
{//set<int> s;//s.insert(5);//s.insert(3);//......int arr[] = { 5,3,7,1,9,2,5,3 }; // 包含重复元素set<int> s(arr, arr + sizeof(arr) / sizeof(int));cout << "Set size: " << s.size() << endl; // 输出6(自动去重)// 正向遍历(自动排序)cout << "Ascending: ";for (auto& num : s) {cout << num << " "; // 1 2 3 5 7 9}// 反向遍历cout << "\nDescending: ";for (auto it = s.rbegin(); it != s.rend(); ++it) {cout << *it << " "; // 9 7 5 3 2 1}// 查找测试cout << "\nCount of 3: " << s.count(3) << endl; // 1cout << "Count of 4: " << s.count(4) << endl; // 0
}
(二)map
1. map的介绍
map文档介绍
翻译:
- map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。
- 在map中,键值key通常用于排序和唯一地标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair:
- typedef pair<const key, T> value_type;
- 在内部,map中的元素总是按照键值key进行比较排序的。
- map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
- map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。
- map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。
注意:
- map 中的元素是键值对。
- key 是唯一的,且不能修改。
- 默认按小于的方式对 key 进行比较。
- 遍历时可得到按 key 排序的序列。
- 底层为平衡搜索树(红黑树),查找效率高,时间复杂度为 O(log₂N)。
- 支持 [ ] 操作符,operator[ ] 中实际进行插入查找。
2. map的使用
(1)模板参数说明
参数名称 | 说明 |
---|---|
Key | 键值对中 key 的类型。 |
T | 键值对中 value 的类型。 |
Compare | 比较器的类型,默认按小于比较,对于内置类型元素一般无需传递,自定义类型时需显式传递比较规则(一般用函数指针或仿函数)。 |
Alloc | 通过空间配置器申请底层空间,默认使用标准库提供的空间配置器,除非用户另有指定。 |
(2)构造函数
构造函数 | 说明 |
---|---|
map() | 构造一个空的 map 。 |
(3)迭代器函数
迭代器函数 | 说明 |
---|---|
begin() | 返回指向首元素的迭代器。 |
end() | 返回指向最后一个元素的下一个位置的迭代器。 |
cbegin() | 返回指向首元素的 const 迭代器,指向的元素不能修改。 |
cend() | 返回指向最后一个元素的下一个位置的 const 迭代器,指向的元素不能修改。 |
rbegin() | 返回反向迭代器,初始指向最后一个元素(即 end 位置),其 ++ 操作向首元素方向移动。 |
rend() | 返回反向迭代器,初始指向第一个元素的前面(即 begin 位置),其 -- 操作向尾元素方向移动。 |
crbegin() | 返回反向 const 迭代器,功能同 rbegin() ,但指向的元素不能修改。 |
crend() | 返回反向 const 迭代器,功能同 rend() ,但指向的元素不能修改。 |
(4)容量与元素访问函数
容量与元素访问函数 | 说明 |
---|---|
empty() | 检测 map 是否为空,若为空返回 true ,否则返回 false 。 |
size() | 返回 map 中有效元素的个数。 |
operator[] | 通过 key 获取对应的 value。当 key 不存在时,会用默认 value 构造键值对并插入,然后返回该默认 value。 |
at() | 与 operator[] 类似,但当 key 不存在时直接抛异常。 |
(5)元素修改函数
元素修改函数 | 说明 |
---|---|
insert(const value_type& x) | 插入键值对 x ,返回值包含新插入元素的位置和是否插入成功。 |
erase(iterator position) | 删除 position 位置上的元素。 |
erase(const key_type& x) | 删除键值为 x 的元素。 |
erase(iterator first, iterator last) | 删除 [first, last) 区间中的元素。 |
swap(map<Key, T, Compare, Allocator>& mp) | 交换两个 map 中的元素。 |
clear() | 清空 map 中的元素。 |
find(const key_type& x) | 查找键值为 x 的元素,找到返回该元素的位置的迭代器,否则返回 end 。 |
count(const key_type& x) | 返回键值为 x 的键值在 map 中的个数,由于 map 中 key 唯一,返回值要么为 0,要么为 1。 |
(6)常用接口
map<string, int> m;// 插入
m.insert(make_pair("apple", 5));
m["banana"] = 3; // 使用[]插入// 访问
int num = m["apple"]; // 不存在会插入默认值
int num2 = m.at("apple"); // 不存在抛异常// 删除
m.erase("banana");// 查找
auto pos = m.find("apple");
if(pos != m.end()) {cout << pos->first << ": " << pos->second;
}
(7)使用示例
#include <iostream>
#include <string>
#include <map>
using namespace std;int main()
{map<string, string> m;// 向map中插入元素的几种方式pair<string, string> kv("peach", "桃子");m.insert(kv); // 有名对象m.insert(pair<string, string>("peach", "桃子")); // 匿名对象m.insert(make_pair("banana", "香蕉")); // 函数模板m.insert({ "apple", "苹果" }); // 隐式类型转换m["apple"] = "苹果"; // 若key不存在则插入,默认构造value然后赋值// 用迭代器遍历map,可得到按key排序的序列cout << "Map contents:" << endl;for (auto& e : m) {cout << e.first << " ---> " << e.second << endl;}// 尝试插入已存在的keyauto ret = m.insert(make_pair("peach", "桃色"));if (!ret.second) {cout << "Key 'peach' already exists: " << ret.first->first << " ---> "<< ret.first->second << " Insert failed" << endl;}// 删除key为"apple"的元素m.erase("apple");if (m.count("apple") == 0) {cout << "Apple has been erased" << endl;}// 修改值m["banana"] = "大香蕉"; // 修改已有项// 遍历输出cout << "Map after update:" << endl;for (auto& entry : m) {cout << entry.first << " => " << entry.second << endl;}// 危险操作:访问不存在的键cout << "Peach: " << m["peach"] << endl; // 插入空值// m.at("watermelon") = "西瓜"; // 抛出异常// 安全查找auto pos = m.find("pear");if (pos != m.end()) {cout << "Found pear: " << pos->second << endl;}else {cout << "Pear not found!" << endl;}
}
(三)multiset
1. multiset的介绍
multiset文档介绍
翻译:
- multiset是按照特定顺序存储元素的容器,其中元素是可以重复的。
- 在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value, value>组成的键值对,因此value本身就是key,key就是value,类型为T). multiset元素的值不能在容器中进行修改(因为元素总是const的),但可以从容器中插入或删除。
- 在内部,multiset中的元素总是按照其内部比较规则(类型比较)所指示的特定严格弱排序准则进行排序。
- multiset容器通过key访问单个元素的速度通常比unordered_multiset容器慢,但当使用迭代器遍历时会得到一个有序序列。
- multiset底层结构为二叉搜索树(红黑树)。
注意:
- multiset在底层中存储的是<value, value>的键值对
- mtltiset的插入接口中只需要插入即可
- 与set的区别是,multiset中的元素可以重复,set是中value是唯一的
- 使用迭代器对multiset中的元素进行遍历,可以得到有序的序列
- multiset中的元素不能修改
- 在multiset中找某个元素,时间复杂度为O(log₂N)
- multiset的作用:可以对元素进行排序
2. multiset的使用
#include <set>
#include <iostream>
using namespace std;int main()
{int array[] = { 2, 1, 3, 3, 9, 6, 6, 0, 5, 8, 4, 7 };multiset<int> s(array, array + sizeof(array) / sizeof(array[0]));// 遍历multiset,可得到按升序排序且允许重复元素的序列for (auto& e : s)cout << e << " ";cout << endl;
}
(四)multimap
1. multimap的介绍
multimap文档介绍
翻译:
- Multimaps是关联式容器,它按照特定的顺序,存储由key和value映射成的键值对<key,value>,其中多个键值对之间的key是可以重复的。
- 在multimap中,通常按照key排序和唯一地标识元素,而映射的value存储与key关联的内容。key和value的类型可能不同,通过multimap内部的成员类型value_type组合在一起,value_type是组合key和value的键值对:
- typedef pair<const Key, T> value_type;
- 在内部,multimap中的元素总是通过其内部比较对象,按照指定的特定严格弱排序标准对key进行排序的。
- multimap通过key访问单个元素的速度通常比unordered_multimap容器慢,但是使用迭代器直接遍历multimap中的元素可以得到关于key有序的序列。
- multimap在底层用二叉搜索树(红黑树)来实现。
注意:
- map中的key是唯一的,而multimap中key是可以重复的。
- 不支持 [ ] 运算符。
2. multimap的使用
#include <map>
#include <iostream>
using namespace std;int main()
{multimap<string, string> contacts;contacts.insert(make_pair("John", "123-4567"));contacts.insert(make_pair("John", "123-4568"));contacts.insert(make_pair("Alice", "555-1234"));// 查找所有John的联系方式auto range = contacts.equal_range("John");cout << "John's numbers:\n";for (auto it = range.first; it != range.second; ++it) {cout << it->second << endl;}
}
四、容器对比
特性 | set | multiset | map | multimap |
---|---|---|---|---|
存储元素 | 唯一值 | 可重复值 | 唯一键 | 可重复键 |
数据组织 | 值即键 | 值即键 | 键值对 | 键值对 |
[ ]运算符 | 不支持 | 不支持 | 支持 | 不支持 |
典型应用场景 | 去重/排序 | 排序统计 | 字典/映射 | 多映射 |
相关文章:
STL详解 - map和set
目录 一、关联式容器概述 二、键值对 三、树形结构的关联式容器 (一)set 1. set的介绍 2. set的使用 (1)模板参数列表 (2)构造函数 (3)迭代器函数 (4ÿ…...
SpringBoot 集成滑块验证码AJ-Captcha行为验证码 Redis分布式 接口限流 防爬虫
介绍 滑块验证码比传统的字符验证码更加直观和用户友好,能够很好防止爬虫获取数据。 AJ-Captcha行为验证码,包含滑动拼图、文字点选两种方式,UI支持弹出和嵌入两种方式。后端提供Java实现,前端提供了php、angular、html、vue、u…...
高并发PHP部署演进:从虚拟机到K8S的DevOps实践优化
一、虚拟机环境下的部署演进 1. 低并发场景(QPS<10)的简单模式 # 典型部署脚本示例 ssh userproduction "cd /var/www && git pull origin master" 技术痛点: 文件替换期间导致Nginx返回502错误(统计显示…...
vue引入物理引擎matter.js
vue引入物理引擎matter.js 在 Vue 项目中集成 Matter.js 物理引擎的步骤如下: 1. 安装 Matter.js npm install matter-js # 或 yarn add matter-js2. 创建 Vue 组件 <template><div ref="physicsContainer" class="physics-container"><…...
【实战项目】简易版的 QQ 音乐:一
> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:能自我实现简易版的 QQ 音乐。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! > 专栏选自:…...
部署Superset BI(三)连接HANA数据库
metabase和redash都不支持HANA数据库,选择superset就是看重这一点,开始尝试连接HANA数据库。 按Superset的技术文档:pip install hdbcli sqlalchemy-hana or pip install apache-superset[hana] --进入容器 rootNocobase:/usr/superset/supe…...
快速学会Linux的WEB服务
一.用户常用关于WEB的信息 什么是WWW www是world wide web的缩写,及万维网,也就是全球信息广播的意思 通常说的上网就是使用www来查询用户所需要的信息。 www可以结合文字、图形、影像以及声音等多媒体,超链接的方式将信息以Internet传递到世…...
如何搭建spark yarn模式集群的集群
以下是搭建 Spark YARN 模式集群的一般步骤: 准备工作 确保集群中各节点已安装并配置好 Java 环境,且版本符合 Spark 要求。规划好集群中节点的角色,如 Master 节点、Worker 节点等,并确保各节点之间网络畅通,能相互…...
端口安全基本配置
1.top图 2.交换机配置 交换机swa <SWA> system-view [SWA] vlan batch 10 20[SWA] interface GigabitEthernet0/0/1 [SWA-GigabitEthernet0/0/1] port link-type trunk [SWA-GigabitEthernet0/0/1] port trunk allow-pass vlan 10[SWA] interface GigabitEthernet0/0/2 …...
【JsonCpp、Muduo、C++11】JsonCpp库、Muduo库、C++11异步操作
JsonCpp库、Muduo库、C11异步操作 1. JsonCpp库1.1 Json数据格式1.2 JsonCpp介绍1.3 JsonCpp使用 2. Muduo库2.1 Muduo库常见接口介绍2.1.1 TcpServer类基础介绍2.1.2 EventLoop类基础介绍2.1.3 TcpConnection类基础介绍2.1.4 Buffer类基础介绍2.1.5 TcpClient类基础介绍 2.2 M…...
【自然语言处理与大模型】LlamaIndex的词嵌入模型和向量数据库
(1)嵌入模型的定义和作用 嵌入模型(Embedding Model)的本质在于将高维的、稀疏的数据转换为低维的、密集的向量表示,使得这些向量能够在数学空间中表达原始数据的语义信息。作用如下: 降维表示:…...
SLAM算法工程师面经大全:2025年面试真题解析与实战指南
SLAM算法工程师面经大全:2025年面试真题解析与实战指南 一、SLAM技术概述与核心原理 1.SLAM基础理论框架 SLAM算法的核心在于同步定位与建图,这一过程涉及传感器数据融合、运动建模与优化方法。在传感器数据融合方面,不同类型的…...
虚拟现实视频播放器 2.6.1 | 支持多种VR格式,提供沉浸式观看体验的媒体播放器
虚拟现实媒体播放器是一款专为在智能手机上播放VR(虚拟现实)照片和视频而设计的应用程序。它支持多种格式的影像内容,包括360和180等距矩形柱面、标准镜头和鱼眼镜头拍摄的照片和视频,并且兼容3D立体并排、上/下以及收缩媒体格式。…...
从黔西游船侧翻事件看极端天气预警的科技防线——疾风气象大模型如何实现精准防御?
近日,贵州省黔西市一起载人游船侧翻事故令人痛心。调查显示,事发时当地突遇强风暴雨,水面突发巨浪导致船只失控。这一事件再次凸显:在极端天气频发的时代,传统“经验式防灾”已不足够,唯有依靠智能化的气象预警技术,才能筑牢安全底线。 极端天气预警的痛点:为什么传统方…...
颠覆监测体验!WM102无线温湿度记录仪开启智能物联新时代
当温湿度失控成为企业隐形成本杀手,您是否还在用传统设备疲于应对?一款集智能、精准、全能于一身的神器横空出世——WM102无线温湿度记录仪,用硬核科技重新定义环境监测! ▌5大场景痛点 一招破解 无论是医药冷库里的疫苗守护战&am…...
Linux云服务器配置git开发环境
文章目录 1. 安装 git2. git clone3. git add .4. git commit -m 提交记录5. git push🍑 异常原因🍑 解决办法 6. git pull7. git log8. git rm9. git mv10. git status 1. 安装 git sudo yum install git -y2. git clone 此命令的作用是从远程仓库把代…...
山东大学软件学院项目实训-基于大模型的模拟面试系统-个人主页头像上传
采用图床的方案,存储用户头像。 实现步骤 引入OSS依赖 在我们的SpringBoot项目中引入OSS依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version> &l…...
AI智能体|扣子(Coze)实战【天气查询插件开发教程】
大家好,我是偶然,AI洞察,AI智能体,AI实战案例分享 今天教大家用 Coze 开发一个天气插件,本来我是想教大家怎么用 AI 写代码节点实现节点功能的,但是我感觉太复杂了。 起码来说,我还没做到用特别…...
VBA ListBox/ComboBox 响应鼠标滚轮操作
一般情况下,在Excel的vba窗口中,我们是无法使用鼠标滚轮控制例如 ListBox 和 ComboBox 控件的。我们只能通过鼠标点击的方式来逐个选择选项。 我们都知道,通过鼠标滚轮快速的上下滚动候选项,以快速的定位选择选项,这是…...
Linux 更改内存交换 swap 为 zram 压缩,减小磁盘写入
1、查看当前 swap 的方式 swapon --show 我这里是默认的 swap 文件,大小为 2G。 2、安装 zram Ubuntu 下: sudo apt install zram-tools安装后默认会启动: 3、关闭默认的 swap 文件 sudo swapoff /swapfile 其次是关闭 /etc/fstab 中的 …...
TypeScript简介
🌟 TypeScript入门 TypeScript 是 JavaScript 的超集,由微软开发并维护,通过静态类型检查和现代语言特性,让大型应用开发变得更加可靠和高效。 // 一个简单的 TypeScript 示例 interface User {name: string;age: number;greet():…...
Facebook如何运用AI实现元宇宙的无限可能?
引言 元宇宙(Metaverse)是一个虚拟的、由多个 3D 虚拟世界组成的网络,用户可以在其中进行互动、游戏、工作和社交。Facebook 作为全球最大的社交媒体平台之一,对元宇宙的构建和实现有着深远的影响。通过运用人工智能(…...
【大语言模型ChatGPT+Python】近红外光谱数据分析及机器学习与深度学习建模(近红外光谱数据分析、定性/定量分析模型代码自动生成等)
近红外光谱数据分析是一种重要的分析技术,广泛应用于化学、食品、制药、农业、环境科学等领域。以下是关于近红外光谱数据分析的详细介绍: 一、基本原理 近红外光谱的范围 近红外光谱是指波长范围在780 - 2500纳米的电磁辐射。在这个波段,分子…...
ArcGIS Pro图斑属性自动联动更新-在线卫星底图图斑采集
今天介绍一下在ArcGIS Pro图斑属性自动联动更新 主要介绍内容: 1、ArcGIS Pro数据设计中属性规则的设置,实现图斑属性的自动更新与联动更新。 2、介绍ArcGIS Pro不能新建要素类图层的原因 3、包括新建字段等内容 4、deepseek查询arcade计算图斑面积语…...
OpenHarmony GPIO应用开发-LED
学习于: https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/driver/driver-platform-gpio-develop.md https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/driver/driver-platform-gpio-des.md 通过OpenHarmony官方文档指导可获知:芯片厂…...
C语言结构体内存对齐使用场景
#pragma pack(push, 1) 和 #pragma pack(pop) 的使用场景(C语言) 这两个预处理指令用于控制结构体成员的内存对齐方式,主要在以下场景中使用: 主要使用场景 网络通信协议处理 当需要精确控制结构体布局以匹配网络协议格式时 确…...
极速轻量,Rust 网络开发新选择:Hyperlane 框架深度解析
极速轻量,Rust 网络开发新选择:Hyperlane 框架深度解析 在高性能网络服务开发领域,Rust 凭借其内存安全与高效并发的特性备受青睐。今天,我们迎来一款专为现代 Web 服务打造的明星框架——Hyperlane,它以“轻量高效、…...
从零开始学习人工智能(Python高级教程)Day6-Python3 正则表达式
一、Python3 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 在 Python 中,使用 re 模块来处理正则表达式。 re 模块提供了一组函数,允许你在字符串中进行模式匹配、搜索和替换操作。 r…...
UKCC(原OUCC)真题讲解(一)
题目链接:PRACTICE - 2025 Coding Challenge - UK Bebras 1.GreenStar 方法:使用模块 参考答案: 【知识点】 这里的长度100,是指中心到角的距离。 2.Draw a Square 参考答案: 【知识点】 在正多边形的图案中&#…...
Linux——特殊权限管理
Linux中的特殊权限(setuid、setgid、sticky bit)扩展了基本的文件权限机制,提供了更精细的控制。以下是详细说明: 1. SetUID(SUID) 作用:允许用户以文件所有者的权限执行文件。 例如:…...
Ubuntu18.04搭建samda服务器
一.什么是Samba服务器? Samba服务器是一种基于开源协议实现的网络共享服务软件,主要用于在不同操作系统(如Windows、Linux、Unix)之间实现文件和打印机共享功能。其核心目标是解决跨平台资源共享的兼容性问题,尤其是在…...
vue3搭建后台管理系统
找menu菜单 上部用height设置高度和背景颜色 需要自己改左侧栏的边线 将el-menu的border设置为0,然后上方设置border-right设置边框 设置右边 创建data.vue input组件 导入icon图标 引入import 一个template 设置个card el-card 定义card 加el-button查询 el-table表单 …...
[学习]RTKLib详解:pntpos.c与postpos.c
文章目录 RTKLib详解:pntpos.c与postpos.cPart A: pntpos.c一、概述二、整体工作流程三、主要函数说明1. pntpos()2. satposs()3. estpos()4. rescode()5. prange()6. ionocorr()7. tropcorr()8. valsol()9. raim_fde()10. estvel() 四、函数调用关系图(…...
64.微服务保姆教程 (七) RocketMQ--分布式消息中间件
RocketMQ–分布式消息中间件 一、MQ 1、什么是MQ MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递——生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队…...
邀约媒体,邀请到场 多少钱?
传媒如春雨,润物细无声,大家好,我是51媒体胡老师。 在策划线下活动时,媒体邀约是提升品牌曝光度和影响力的重要环节。不同类型和规模的媒体邀约,其预算需求也各不相同。以下为各类媒体邀约的费用概览及影响因素&#…...
Android数据库全栈开发实战:Room+SQLCipher+Hilt企业级应用构建
简介 在移动应用开发中,数据库作为数据存储的核心组件,其安全性和性能对企业级应用至关重要。本文将从零开始,全面讲解Android数据库开发的最新技术,包括Room框架的深度使用、SQLCipher加密数据库的实现、Hilt依赖注入的集成以及前后端数据同步的完整方案。通过一个加密任…...
Kafka与RocketMQ在事务消息实现上的区别是什么?
一、Kafka事务消息核心实现(基于2.8版本) // KafkaProducer.java public synchronized Future<RecordMetadata> send(ProducerRecord<K, V> record) {// 事务消息校验(第256行)if (transactionManager ! null &&…...
Maven 依赖发布与仓库治理
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
hybird接口配置
【sw1】 [sw1]vlan batch 10 20 [sw1]int g 0/0/3 [sw1-GigabitEthernet0/0/1]port hybrid tagged vlan 10 20 [sw1-GigabitEthernet0/0/1]int g 0/0/1 [sw1-GigabitEthernet0/0/2]port hybrid pvid vlan 10 [sw1-GigabitEthernet0/0/2]port hybrid untagged vlan 10 20 …...
AI视频智能分析网关打造社区/工厂/校园/仓库智慧消防实现精准化安全管控
一、背景 随着社区、商业场所对消防安全要求日益提升,传统消防系统已难以满足智能化、精细化管理需求。智能分析网关融合物联网与人工智能技术,具备强大的数据处理与分析能力,可全面升级消防系统。将其融入消防系统各层级,搭建智…...
Web3 应用中常见的数据安全风险及防护措施
随着 Web3 技术的蓬勃发展,我们见证了一个全新的互联网时代的到来。Web3 应用以其去中心化、用户控制数据和透明性的特点,为用户提供了前所未有的体验。然而,这些应用在提供便利的同时,也带来了一系列数据安全风险。本文将探讨 We…...
免费视频压缩软件
一、本地软件(支持离线使用) 1. HandBrake 平台:Windows / macOS / Linux 特点:开源免费,支持多种格式转换,提供丰富的预设选项(如“Fast 1080p”快速压缩),可自定义分…...
Java实用注解篇: @JSONField
前言 在 Java 开发中,进行对象与 JSON 的相互转换是一项常见操作,尤其在前后端分离的架构中显得尤为重要。Fastjson 作为阿里巴巴开源的 JSON 处理框架,因其高性能和强大功能而被广泛使用。JSONField 是 Fastjson 提供的一个注解,…...
浔川AI 第二次内测报告
浔川AI 第二次内测报告 执行社团:浔川社团官方联合会、总社团联合会 同意执行社团:总社团联合会 合作社团:暮烟社团官方联合会 合作分社团:浔川AI分社团、浔川AI分部 被执行内测程序:浔川AI 内测第二代 被执行内…...
React Hooks 深入浅出
目录 引言:React Hooks 的革命基础 Hooks useState:状态管理的新方式useEffect:组件生命周期的替代方案useContext:简化 Context API 额外的 Hooks useReducer:复杂状态逻辑的管理useCallback 与 useMemo:…...
解释 NestJS 的架构理念(例如,模块化、可扩展性、渐进式框架)
一、模块化设计 // user.module.ts Module({controllers: [UserController], // 当前模块的控制器providers: [UserService], // 当前模块的服务exports: [UserService] // 暴露给其他模块使用的服务 }) export class UserModule {}// order.module.ts Module({…...
Caffeine快速入门
依赖 <dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.2.0</version> </dependency> Cache的基本api操作 Caffeine.newBuilder.build来构建Caffeine .maximumS…...
【踩坑记录】项目Bug分析:一次因 `String.isBlank()` 引发的崩溃(No such instance method: ‘isBlank‘)
项目Bug分析:一次因 String.isBlank() 引发的崩溃 一、前言 在日常的 Java 项目开发中,使用 String 的常见工具方法如 isEmpty()、trim() 等已司空见惯。然而,近期在一次项目中使用了 String.isBlank() 方法,结果竟然直接导致崩…...
SpringBoot整合Kafka、Flink实现流式处理
引言 在当今大数据处理领域,实时数据流处理变得越来越重要。Apache Kafka作为一个高吞吐量的分布式流处理平台,结合Apache Flink这一强大的流处理框架,可以构建出高效的实时数据处理系统。本文将指导您如何在SpringBoot应用中整合Kafka和Fli…...
互联网大厂Java求职面试:云原生与AI融合下的系统设计挑战-2
互联网大厂Java求职面试:云原生与AI融合下的系统设计挑战-2 第一轮提问:云原生架构选型与微服务治理 面试官(技术总监):郑薪苦,我们先从一个基础问题开始。你了解Spring Cloud和Kubernetes在微服务架构中…...