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