map与unordered_map区别

底层实现区别

map 的底层实现是基于红黑树实现的,红黑树又属于二叉搜索树,具有自动排序的功能,所以map天然具有自动排序的功能,而红黑树上的节点都代表着map的元素。对于map的操作就是对红黑树进行操作,复杂度为O(log n)。

unordered_map 的底层实现是基于哈希表(散列表)实现的,它通过哈希函数将键直接映射到哈希表中的存储位置,从而实现快速定位与访问。哈希表依靠哈希算法完成键到位置的转换,因此 unordered_map不具备自动排序功能,元素存储顺序完全由哈希结果决定。我们对 unordered_map 的操作本质上是对哈希表进行寻址、插入和冲突处理,平均时间复杂度可以达到 O(1),查询效率极高。

原理图展示:


函数实现

map 与 unordered_map 函数接口对比:

两者对外提供的成员函数几乎完全一致,使用方式相同,区别只在底层与特性:

插入:insert()、operator\[\]

查找:find()

删除:erase()

遍历:范围 for / 迭代器

容量:size()、empty()、clear()

键存在判断:count()(map 返回 0/1,unordered_map 也一样)

函数实现区别:(通过部分函数的使用来解说函数的实现区别)

map 的底层是红黑树,而红黑树本质是一棵二叉搜索树,因此同样遵循左子树节点值小于根节点、右子树节点值大于根节点 的排序规则,这也是 map 元素能够自动有序的根本原因。。当查找时从根节点按大小比较向下遍历,插入时找到适合位置后通过旋转保持平衡,删除后同样需要平衡(这里的平衡就是让树接着保持红黑树左小右大的特性),所有操作复杂度为O(log n)。

unordered_map的底层是哈希表,通过哈希函数将键映射到对于桶位置。查找时直接通过哈希值定位桶,插入时放入对应桶并处理冲突,删除时只需要移除对应桶的元素。平均复杂度为O(1),但不保顺序。


总结

|--------|---------------|------------------|
| 容器 | map | unordered_map |
| 效率 | O(log n) | 平均为O(1),最坏为O(n) |
| 内存对比 | 较高(红黑树存储额外指针) | 更高(哈希表存在空闲桶) |
| key值对比 | 必须支持<运算符 | 必须支持哈希函数与 == 运算符 |
| 迭代器对比 | 双向迭代器 | 前向迭代器 |
| 适用场景 | 排序需求、数据量小、稳定 | 速度需求、无速度需求、数据量大 |

相关推荐
GreenTea9 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
fqq310 小时前
力扣刷题前置Java语法
算法·leetcode·职场和发展
2501_9065651212 小时前
数学之美探究
算法
oier_Asad.Chen12 小时前
【洛谷题解/AcWing题解/OI学习笔记】洛谷P2868【USACO07DEC】Sightseeing Cows G(01分数规划求最大比率)
算法·图论·spfa·二分·负环
leisoo809714 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法
luj_176816 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
郝学胜-神的一滴17 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
爱编程的小新☆17 小时前
【LeetCode】从递归到 Flood Fill:5 道题吃透 DFS 的选择、回溯与标记
java·算法·leetcode·深度优先·回溯·flood fill
Water_Sunzhipeng17 小时前
2024牛客暑期多校训练营1
算法
hetao173383717 小时前
2026-08-09~08-14 hetao1733837 的刷题记录
c++·算法