首页/新闻资讯/正文详情

【C++ unordered_map与unordered_set】哈希版关联容器入门

发布时间:2026/11/3 19:31:24 来源:云帆数科 栏目:资讯中心
【C++ unordered_map与unordered_set】哈希版关联容器入门
C unordered_map与unordered_set哈希版关联容器入门大家好前面 map 和 set 用得挺顺但它们底层是红黑树、按 key 有序。这篇介绍哈希版本——unordered_map 和 unordered_set底层换成哈希表增删查平均 O(1)代价是遍历无序。这是一篇承上启下的文章先把这两个容器怎么用、和 map/set 差在哪讲清楚为后面学习哈希表打底。目录一、为什么叫 unordered 而不是 hash二、unordered_set 是什么三、unordered_set 和 set 的三个差异四、性能对比实测五、unordered_map 和 map 的三个差异六、unordered_multimap / unordered_multiset七、Buckets 和 Hash policy 接口八、哈希版和树版怎么选一、为什么叫 unordered 而不是 hashC11 之前标准库只有 map 和 set底层是红黑树。C11 引入哈希版本时命名犯了难直接叫hash_map容易让人误会——以为 map 是大类、hash_map 是它的一个子类但实际上哈希版和红黑树版是平级的两套东西不存在谁包含谁。最终标准选了unordered_这个前缀意思是无序的和原来有序的 map/set 从语义上拉开区分。顺便对比一下 JavaJava 出得晚设计时就把两套都想好了直接叫TreeMap/TreeSet和HashMap/HashSet一看就懂。所以要吐槽 C 命名只能吐槽它出得太早了 -_- 。二、unordered_set 是什么官方参考文档https://legacy.cplusplus.com/reference/unordered_set/先看模板声明templateclassKey,classHashhashKey,classKeyEqualequal_toKey,classAllocallocatorKeyclassunordered_set;四个模板参数日常只需要传第一个Key存的 key 的类型Hash把 Key 转成整数的仿函数默认hashKeyKeyEqual判断两个 Key 是否相等的仿函数默认equal_toKeyAlloc空间配置器默认用标准的。后三个参数大多数情况都用默认值不用自己传。什么时候才需要自己写比如你的 Key 是个自定义结构体默认hash和不认识它这时才自己写一个仿函数传进去。底层是哈希桶实现增删查平均 O(1)。迭代器遍历不再有序——为了和 set 区分所以叫 unordered_set。三、unordered_set 和 set 的三个差异set 和 unordered_set 功能高度相似接口insert / erase / find用法几乎一样这里只讲差异。差异一对 Key 的要求不同set 要求 Key 支持小于比较因为红黑树要靠它排大小unordered_set 要求 Key 支持转成整数算哈希值和相等比较解决哈希冲突后判断是不是同一个 key。这两个要求本质是哈希表的要求后面学习了哈希表时会彻底理解现在先记住结论。差异二迭代器和遍历顺序set 的 iterator 是双向迭代器底层红黑树走中序遍历出来有序 去重unordered_set 的 iterator 是单向迭代器只能不能--底层哈希表遍历出来无序 去重。差异三性能红黑树增删查是 O(logN)哈希表增删查平均 O(1)。大多数场景下 unordered_set 更快下面实测代码跑一下就有直观感受。pairiterator,boolinsert(constvalue_typeval);size_typeerase(constkey_typek);iteratorfind(constkey_typek);四、性能对比实测下面这段代码生成 100 万个数据分别塞进 set 和 unordered_set对比插入、查找、删除的耗时。测试代码也没啥意思不讲大家 copy 下来自己跑#includeunordered_set#includeunordered_map#includeset#includevector#includeiostreamusingnamespacestd;inttest_set2(){constsize_t N1000000;unordered_setintus;setints;vectorintv;v.reserve(N);srand(time(0));for(size_t i0;iN;i){//v.push_back(rand()); // N比较大时重复值比较多v.push_back(rand()i);// 重复值相对少//v.push_back(i); // 没有重复有序}size_t begin1clock();for(autoe:v){s.insert(e);}size_t end1clock();coutset insert:end1-begin1endl;size_t begin2clock();us.reserve(N);for(autoe:v){us.insert(e);}size_t end2clock();coutunordered_set insert:end2-begin2endl;intm10;size_t begin3clock();for(autoe:v){autorets.find(e);if(ret!s.end()){m1;}}size_t end3clock();coutset find:end3-begin3-m1endl;intm20;size_t begin4clock();for(autoe:v){autoretus.find(e);if(ret!us.end()){m2;}}size_t end4clock();coutunordered_set find:end4-begin4-m2endl;cout插入数据个数: s.size()endl;cout插入数据个数: us.size()endlendl;size_t begin5clock();for(autoe:v){s.erase(e);}size_t end5clock();coutset erase:end5-begin5endl;size_t begin6clock();for(autoe:v){us.erase(e);}size_t end6clock();coutunordered_set erase:end6-begin6endlendl;return0;}intmain(){test_set2();return0;}跑出来 unordered_set 三项基本都比 set 快尤其查找差距最明显。五、unordered_map 和 map 的三个差异unordered_map 和 map 的关系跟 unordered_set 和 set 完全对称差异也是同样三条对 Key 的要求map 要求 Key 支持小于比较unordered_map 要求 Key 支持转整数 相等比较。迭代器和遍历顺序map 是双向迭代器遍历按 key有序unordered_map 是单向迭代器遍历无序。性能红黑树 O(logN)哈希表平均 O(1)。接口上 insert / find / operator[] 的用法跟 map 一样不再重复演示。六、unordered_multimap / unordered_multiset这两个跟 multimap / multiset 是一对允许 key 冗余同一个 key 可以存多份。它们和对应 multimap/multiset 的差异也是那三条key 要求、迭代器和遍历顺序、性能。用法照抄 multimap/multiset底层换成哈希表即可。七、Buckets 和 Hash policy 接口unordered 系列还有一组跟哈希桶和负载因子相关的接口桶数、桶里有几个元素、最大负载因子、扩容时机等等。日常使用我们不用太关注等后面学了哈希表、理解了负载因子和扩容逻辑之后再回头看这组接口就一目了然。八、哈希版和树版怎么选一句话选型需要按 key 有序遍历、取范围比如按时间排序输出、找 [a, b] 区间→ 用 map / set只关心快速查找、不要求顺序比如缓存、去重、计数→ 用 unordered_map / unordered_set平均更快。这篇只是把怎么用讲了哈希表为什么能做到 O(1)、哈希冲突怎么解决、负载因子和扩容怎么回事——下一篇我们正式学习哈希表把这些底层原理拆开看看。

相关推荐

1000G 超大体积高清视频如何实现 1 秒瞬时加载与加密播放?流式分块映射与 Intel AES-NI 硬件加速实践
1000G 超大体积高清视频如何实现 1 秒瞬时加载与加密播放?流式分块映射与 Intel AES-NI 硬件加速实践

核心结论(TL;DR):在外科手术 4K 无损实录、大型工业仿真建模、航空测绘及离线实训套课交付场景中,单套高清视频资产动辄达到数十 GB 乃至 1000GB(1TB) 级别。传统加密播放器采用“启动时全量校验或整包预解… · 2026/11/3 19:30:24

高精度计算入门与immense数据模型精讲(六)
高精度计算入门与immense数据模型精讲(六)

跳转链接 高精度计算入门与immense数据模型精讲(一)高精度计算入门与immense数据模型精讲(二)高精度计算入门与immense数据模型精讲(三)高精度计算入门与immense数据模型精讲(四)高… · 2026/11/3 19:30:24

顺序编码制还是著者-出版年制:引注体例怎么选,正文与文末怎么对上
顺序编码制还是著者-出版年制:引注体例怎么选,正文与文末怎么对上

参考文献用哪套体例,表面是格式偏好,实质是选一种定位机制:顺序编码把「第几个引用」当坐标,著者-出版年把「谁在哪年说的」当坐标。两套坐标各有各的易错处。结论先行:两套体例靠什么对齐顺序编码制的对应关系是「编号… · 2026/11/3 19:30:24

基于遗传算法的自适应PID控制在二阶系统中的应用
基于遗传算法的自适应PID控制在二阶系统中的应用

1. 二阶系统与PID控制的基础原理在工业控制领域,二阶系统是最常见的被控对象模型之一。这类系统的动态特性可以用二阶微分方程来描述,其传递函数通常表现为:G(s) K / (s 2ζωₙs ωₙ)其中,K为系统增益,ζ为阻尼比… · 2026/11/3 20:11:45

Python标识符命名规范与工程实践指南
Python标识符命名规范与工程实践指南

1. 从一道期末真题看标识符命名的陷阱去年期末考场上的一道Python基础题让不少同学栽了跟头。题目要求判断以下哪个是合法的Python标识符:2nd_place_internal_dataclassprice$正确答案是2,但考场上有近40%的同学选择了包含1或3的选项。这个结果让我意识到… · 2026/11/3 20:11:45

云端部署Qwen-Image-2.1:20分钟搞定,成本不到5毛
云端部署Qwen-Image-2.1:20分钟搞定,成本不到5毛

云端部署Qwen-Image-2.1,20分钟搞定,花费不到5毛 前阵子有个做独立开发的朋友找我吐槽,说他接了个小活,客户要批量生成一批电商主图,量不大,几百张,但要求风格统一、出图质量得过关。他第一反应… · 2026/11/3 20:11:45

联合概率分布在贝叶斯统计推断中的应用与实践
联合概率分布在贝叶斯统计推断中的应用与实践

1. 联合概率分布在统计推断中的核心地位统计推断的本质是从观测数据中反推生成这些数据的概率模型参数。当我们面对多个未知参数时,联合概率分布就成为了连接先验知识与观测数据的桥梁。这种多参数场景在实际问题中极为常见:从医学诊断中的多项生理指标关… · 2026/11/3 20:11:45

AI提示系统架构演进:从单体到分布式实践
AI提示系统架构演进:从单体到分布式实践

1. 项目概述:AI提示系统的架构演进需求最近在重构公司核心的AI提示系统时,我深刻体会到架构演进的重要性。这个系统最初只是一个简单的单体应用,但随着业务量激增和功能复杂度提升,原有的架构已经难以支撑。每天处理上百万次的AI提… · 2026/11/3 20:11:45

AUC、ROC、ACC区别:分类模型评估指标与阈值选择指南
AUC、ROC、ACC区别:分类模型评估指标与阈值选择指南

前阵子帮一个做信贷评分的朋友复盘模型,他发过来的评估报告上写着 ACC 0.97,语气相当轻松,觉得这版可以直接上线了。我让他把混淆矩阵和标签分布一起贴出来,结果正样本占比不到 2%,也就是说一个把所有样本都判成“负”… · 2026/11/3 20:10:44

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码