0

0

c++的unordered_map和map有什么区别 哈希表的实现原理【STL容器】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-12-19 18:03:09

|

625人浏览过

|

来源于php中文网

原创

unordered_map是哈希表实现,map是红黑树实现;前者平均O(1)查找但无序、有rehash开销,后者稳定O(log n)且键有序、内存更紧凑。

c++的unordered_map和map有什么区别 哈希表的实现原理【stl容器】

unordered_map 是哈希表实现,map 是红黑树实现。核心区别在于底层数据结构不同,导致时间复杂度、有序性、内存占用和适用场景都不同。

查找、插入、删除的时间复杂度不同

unordered_map 平均情况下是 O(1),最坏情况(哈希冲突严重时)退化为 O(n);map 稳定为 O(log n),因为基于平衡二叉搜索树。

  • 如果频繁按 key 查找且不关心顺序,unordered_map 更快
  • 若需稳定性能保障(如实时系统),map 更可预测
  • 大量重复插入/删除时,unordered_map 可能因 rehash 触发瞬时延迟

元素是否有序

map 中的键值对按键自动升序排列(支持 lower_boundupper_bound、范围遍历等);unordered_map 无序,遍历顺序取决于哈希值和桶分布,每次运行可能不同。

  • 需要迭代时保持逻辑顺序(如打印配置项、按字典序处理)→ 选 map
  • 只做“存在性检查”或“随机访问”,不依赖顺序 → unordered_map 更合适

哈希表是怎么工作的(unordered_map 底层原理)

unordered_map 使用开放寻址或链地址法解决冲突(GCC 默认用链地址:每个桶是一个链表头指针)。流程如下:

Interior AI
Interior AI

AI室内设计,上传室内照片自动帮你生成多种风格的室内设计图

下载

立即学习C++免费学习笔记(深入)”;

  • 用 hash 函数将 key 映射为 size_t 类型的哈希值
  • 对哈希值取模(hash % bucket_count)得到桶索引
  • 在对应桶中线性查找匹配的 key(调用 == 操作符)
  • 当负载因子(元素数 / 桶数)超过阈值(默认约 1.0),触发 rehash:分配新桶数组、重新散列所有元素

注意:自定义类型作 key 时,必须提供特化的 std::hash 和重载 operator==

内存与构造开销差异

unordered_map 需要额外空间维护哈希桶和链表指针,初始桶数量通常为质数(如 11、23…),空容器也占一定内存;map 是紧凑的树节点结构,每个节点存 key、value、颜色、左右子节点指针,总内存更可控但每节点指针开销固定。

  • 小数据量(
  • 大数据量 + 高频增删 → unordered_map 吞吐更高,但要注意控制最大负载因子避免频繁 rehash
  • map 更适合内存受限或对缓存友好性要求高的场景(树结构局部性更好)

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

534

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

13

2026.01.06

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

74

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

28

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

59

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

35

2025.11.27

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.7万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号