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值对比 | 必须支持<运算符 | 必须支持哈希函数与 == 运算符 |
| 迭代器对比 | 双向迭代器 | 前向迭代器 |
| 适用场景 | 排序需求、数据量小、稳定 | 速度需求、无速度需求、数据量大 |

相关推荐
政企项目老覃6 小时前
大模型幻觉治理与自动评测:金融风控场景的落地实践
人工智能·算法·机器学习
淡海水6 小时前
08-03-不可变-ImmutableDictionary-TKey-TValue-与ImmutableHashSet-T-持久化哈希树
数据结构·算法·c#·哈希算法·dictionary·immutable
hansang_IR6 小时前
【题解】[APIO2023] 赛博乐园 / cyberland
c++·算法·图论
洛阳纸贵7 小时前
MATLAB-matlab基础知识
学习·算法·matlab
落羽的落羽7 小时前
【AI】快速理解AI应用的相关名词概念
linux·c++·人工智能·python·计算机网络·算法
Nil2087 小时前
leetcode 17电话号码的字母组合
算法·leetcode·职场和发展
203号居民9 小时前
LeetCode hot 100 — 25. K 个一组翻转链表
算法·leetcode·链表
ocean21039 小时前
2025-2026年AI算法与模型研发面试高频知识点洞察
人工智能·算法·面试
Nil20810 小时前
leetcode 78子集
数据结构·算法·leetcode