C++ STL 中的 `unordered_map` 和 `unordered_set` 总结
1. unordered_map
unordered_map
是一个基于哈希表实现的容器,存储键值对(key-value
),每个键必须唯一,可以快速插入、删除、查找。
基本特性
- 存储结构:键值对 (
key-value
)。 - 键唯一性:每个键在表中必须是唯一的。
- 无序存储:键值对的存储顺序与插入顺序无关。
- 时间复杂度:
- 平均情况下,插入、删除、查找的时间复杂度为 ( O(1) )。
- 最坏情况下(哈希冲突严重时),时间复杂度为 ( O(n) )。
常用函数
函数 | 功能说明 |
---|---|
insert({key, val}) | 插入键值对,若键已存在,则插入失败。 |
erase(key) | 删除键为 key 的元素,若不存在则不执行操作。 |
find(key) | 返回指向键为 key 的迭代器,若不存在则返回 end() 。 |
operator[key] | 通过键访问或插入值,若键不存在则插入默认值。 |
size() | 返回哈希表中元素的数量。 |
empty() | 判断哈希表是否为空。 |
clear() | 清空哈希表中的所有元素。 |
示例代码
#include <unordered_map>
#include <iostream>
using namespace std;int main() {unordered_map<string, int> map;// 插入键值对map["apple"] = 10;map["banana"] = 20;map.insert({"cherry", 30});// 查找元素if (map.find("banana") != map.end()) {cout << "banana: " << map["banana"] << endl;}// 删除元素map.erase("apple");// 遍历哈希表for (auto& [key, value] : map) {cout << key << ": " << value << endl;}return 0;
}
2. unordered_set
unordered_set
是一个基于哈希表实现的容器,用于存储唯一元素(类似于数学中的集合),不存储值。
基本特性
- 存储结构:仅存储唯一的键(没有值)。
- 键唯一性:集合中的每个键必须唯一。
- 无序存储:元素存储的顺序与插入顺序无关。
- 时间复杂度:
- 平均情况下,插入、删除、查找的时间复杂度为 ( O(1) )。
- 最坏情况下,时间复杂度为 ( O(n) )。
常用函数
函数 | 功能说明 |
---|---|
insert(key) | 插入元素 key ,若元素已存在,则插入失败。 |
erase(key) | 删除元素 key ,若不存在,则不执行操作。 |
find(key) | 查找元素 key ,返回指向该元素的迭代器,若不存在则返回 end() 。 |
count(key) | 判断元素 key 是否存在,返回 1(存在)或 0(不存在)。 |
size() | 返回集合中元素的数量。 |
empty() | 判断集合是否为空。 |
clear() | 清空集合中的所有元素。 |
示例代码
#include <unordered_set>
#include <iostream>
using namespace std;int main() {unordered_set<int> set;// 插入元素set.insert(10);set.insert(20);set.insert(30);set.insert(10); // 插入失败,10 已存在// 查找元素if (set.find(20) != set.end()) {cout << "20 exists in the set!" << endl;}// 删除元素set.erase(20);// 遍历集合for (auto& elem : set) {cout << elem << " ";}return 0;
}
3. unordered_map
和 unordered_set
对比
特性 | unordered_map | unordered_set |
---|---|---|
存储内容 | 键值对 (key-value ) | 仅存储键 |
键的唯一性 | 键必须唯一 | 元素必须唯一 |
访问元素 | 通过键访问对应值,map[key] | 查找元素是否存在,find(key) |
使用场景 | 用于键值对映射,如字典、计数等 | 用于集合操作,如去重、查找是否存在 |
时间复杂度 | 插入、删除、查找的平均复杂度为 ( O(1) ) | 插入、删除、查找的平均复杂度为 ( O(1) ) |
4. 注意事项
- 无序性:
- 元素的存储顺序与插入顺序无关,取决于哈希函数的实现。
- 哈希冲突:
- 哈希表依赖于哈希函数,若哈希冲突严重,会导致性能下降。
- 迭代器失效:
- 插入或删除元素后,迭代器可能会失效。
- 自定义哈希函数:
- 如果需要存储用户自定义类型,可以通过提供自定义哈希函数实现。
5. 常见应用场景
5.1 去重
使用 unordered_set
去除重复元素:
#include <unordered_set>
#include <vector>
#include <iostream>
using namespace std;int main() {vector<int> nums = {1, 2, 2, 3, 4, 4, 5};unordered_set<int> unique(nums.begin(), nums.end());for (auto& elem : unique) {cout << elem << " ";}return 0;
}
输出:
1 2 3 4 5
5.2 统计元素出现次数
使用 unordered_map
统计字符出现次数:
#include <unordered_map>
#include <string>
#include <iostream>
using namespace std;int main() {string text = "hello world";unordered_map<char, int> freq;for (char c : text) {freq[c]++;}for (auto& [ch, count] : freq) {cout << ch << ": " << count << endl;}return 0;
}
输出:
h: 1
e: 1
l: 3
o: 2: 1
w: 1
r: 1
d: 1
总结
unordered_map
:适用于存储键值对,快速查找、统计、映射。unordered_set
:适用于存储唯一键,快速查找、去重、集合操作。
相关文章:
C++ STL 中的 `unordered_map` 和 `unordered_set` 总结
1. unordered_map unordered_map 是一个基于哈希表实现的容器,存储键值对(key-value),每个键必须唯一,可以快速插入、删除、查找。 基本特性 存储结构:键值对 (key-value)。键唯一性:每个键在…...

机器学习基础-概率图模型
(一阶)马尔科夫模型的基本概念 状态、状态转换概率、初始概率 状态转移矩阵的基本概念 隐马尔可夫模型(HMM)的基本概念 条件随机场(CRF)的基本概念 实际应用中的马尔科夫性 自然语言处理: 在词性…...

【MySQL】九、表的内外连接
文章目录 前言Ⅰ. 内连接案例:显示SMITH的名字和部门名称 Ⅱ. 外连接1、左外连接案例:查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来 2、右外连接案例:对stu表和exam表联合查询,把…...
芯片详细讲解,从而区分CPU、MPU、DSP、GPU、FPGA、MCU、SOC、ECU
目录 芯片的概念结构 芯片的派系划分 通用芯片(CPU,MPU,GPU,DSP) 定制芯片(FPGA,ASIC) 芯片之上的集成(MCU,SOC,ECU) 软硬件的匹…...
halcon三维点云数据处理(十)locate_cylinder_3d
目录 一、locate_cylinder_3d例程代码二、gen_binocular_rectification_map函数三、binocular_disparity函数四、自定义函数select_best_candidates五、自定义函数remove_shadowed_regions 一、locate_cylinder_3d例程代码 1、读取或者创建3D形状模型, 2、根据双目…...
vue(2,3), react (16及以上)开发者工具资源
在前端开发的广阔领域中,Vue.js 和 React.js 作为两大主流框架,各自拥有庞大的用户群体和丰富的生态系统。为了帮助开发者更高效地进行调试和开发,Vue Devtools 和 React 开发者工具应运而生,成为这两个框架不可或缺的辅助工具。本…...

2025年华为OD上机考试真题(Java)——整数对最小和
题目: 给定两个整数数组array1、array2,数组元素按升序排列。假设从array1、array2中分别取出一个元素可构成一对元素,现在需要取出k对元素,并对取出的所有元素求和,计算和的最小值。 注意:两对元素如果对应…...

进程间通信——网络通信——UDP
进程间通信(分类):网络通信、无名管道、有名管道、信号、消息队列、共享内存、信号量集 OSI七层模型:(理论模型) 应用层 : 要传输的数据信息,如文件传输,电子邮件等 表示层 : 数…...

【我的 PWN 学习手札】IO_FILE 之 FSOP
FSOP:File Stream Oriented Programming 通过劫持 _IO_list_all 指向伪造的 _IO_FILE_plus,进而调用fake IO_FILE 结构体对象中被伪造的vtable指向的恶意函数。 目录 前言 一、glibc-exit函数浅析 二、FSOP 三、Largebin attack FSOP (…...

新兴的开源 AI Agent 智能体全景技术栈
新兴的开源 AI Agent 智能体全景技术栈 LLMs:开源大模型嵌入模型:开源嵌入模型模型的访问和部署:Ollama数据存储和检索:PostgreSQL, pgvector 和 pgai后端:FastAPI前端:NextJS缺失的一环:评估和…...

统计学习方法(第二版) 概率分布学习
本文主要介绍机器学习的概率分布,帮助后续的理解。 定义直接从书上搬的想自己写,但没有定义准确,还浪费事件,作为个人笔记,遇到速查。 目录 一、二点分布(0-1分布、伯努利分布) 二、二项分布…...

淺談Cocos2djs逆向
前言 簡單聊一下cocos2djs手遊的逆向,有任何相關想法歡迎和我討論^^ 一些概念 列出一些個人認為比較有用的概念: Cocos遊戲的兩大開發工具分別是CocosCreator和CocosStudio,區別是前者是cocos2djs專用的開發工具,後者則是coco…...

【ROS2】RViz2加载URDF模型文件
1、RViz2加载URDF模型文件 1)运行RViz2 rviz22)添加组件:RobotModel 3)选择通过文件添加 4)选择URDF文件,此时会报错,需要修改Fixed Frame为map即可 5)因为没有坐标转换,依然会报错,下面尝试解决 2、运行坐标转换节点 1)运行ROS节点:robot_state_publishe...

Unity导入特效,混合模式无效问题
检查spine导出设置与Unity导入设置是否一致 检查Blend Mode Materials是否勾选 检查是否使用导入时产生的对应混合模式的材质,混合模式不适用默认材质 这里选导入时生成的材质...

el-table自定义按钮控制扩展expand
需求:自定义按钮实现表格扩展内容的展开和收起,实现如下: 将type“expand”的表格列的宽度设置为width"1",让该操作列不展示出来,然后通过ref动态调用组件的内部方法toggleRowExpansion(row, row.expanded)控…...
opencv CV_TM_SQDIFF未定义标识符
opencv CV_TM_SQDIFF未定义标识符 opencv4部分命名发生变换,将CV_WINDOW_AUTOSIZE改为WINDOW_AUTOSIZE;CV_TM_SQDIFF_NORMED改为TM_SQDIFF_NORMED。...
2024acl论文体悟
总结分析归纳 模型架构与训练方法:一些论文关注于改进大语言模型的架构和训练方法,以提高其性能和效率。例如,“Quantized Side Tuning: Fast and Memory-Efficient Tuning of Quantized Large Language Models”提出了一种量化侧调优方法&a…...

【Git原理与使用】版本回退reset 详细介绍、撤销修改、删除文件
目录 一、版本回退 reset 1.1 指令: 1.2 参数说明: 1.3 演示: 二、撤销修改 情况一:对于工作区的代码,还没有 add 情况二:已经 add ,但没有 commit 情况三:已经 add &…...
反规范化带来的数据不一致问题的解决方案
在数据库设计中,规范化(Normalization)和反规范化(Denormalization)是两个相互对立但又不可或缺的概念。规范化旨在消除数据冗余,确保数据的一致性和准确性,但可能会降低查询效率。相反…...
【Android】直接使用binder的transact来代替aidl接口
aidl提供了binder调用的封装,有的时候,比如: 1. 懒得使用aidl生成的接口文件(确实是懒,Android studio中aidl生成接口文件很方便) 2. 服务端的提供者只公开了部分接口出来,只给了调用编号和参…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...

ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...