c++unordered_map与map区别
时间: 2025-05-30 13:10:41 浏览: 25
### C++ 中 `unordered_map` 和 `map` 的区别
#### 数据结构
`map` 是基于红黑树(一种自平衡二叉查找树)实现的数据结构,因此其内部存储的键值对是按照键的顺序排列的。而 `unordered_map` 则是基于哈希表实现的,这意味着它的键值对是没有固定顺序的[^2]。
#### 键的唯一性和重复性
`map` 要求所有的键必须是唯一的,并且这些键会自动按升序或降序排列(取决于模板参数中的比较器)。相比之下,`unordered_map` 同样要求键是唯一的,但它不会对键进行排序,而是通过哈希函数定位键的位置[^1]。
#### 插入和删除性能
由于 `map` 基于红黑树,插入和删除操作的时间复杂度均为 O(log N),其中 N 表示当前容器中元素的数量。而对于 `unordered_map` 来说,理想情况下插入和删除操作的时间复杂度为常量时间 O(1),但在最坏的情况下(当发生大量哈希冲突时),可能会退化到线性时间 O(N)[^3]。
#### 查找效率
同样地,在 `map` 中执行查找操作也需要花费 O(log N) 时间;而在 `unordered_map` 中,如果哈希分布均匀,则平均查找时间为 O(1),但如果存在严重的哈希碰撞则可能达到 O(N)。
#### 内存占用情况
通常来说,因为需要维护额外的信息用于保持节点之间的链接关系以及支持快速随机访问特性等原因,使得 `unordered_map` 在某些特定条件下可能会比相同大小下的 `map` 占用更多内存空间[^3]。
#### 遍历顺序
遍历时,`map` 提供了一个已排序版本的结果集给迭代器使用,这正是它的一个重要特点之一——能够轻松获取按键值自然排序后的数据集合。然而对于 `unordered_map` ,我们无法预测或者依赖任何特定次序来进行枚举处理。
```cpp
#include <iostream>
#include <map>
#include <unordered_map>
void demonstrateMapAndUnorderedMap() {
std::map<int, std::string> ordered;
std::unordered_map<int, std::string> unordered;
ordered[3] = "Three";
ordered[1] = "One";
ordered[2] = "Two";
unordered[3] = "Three";
unordered[1] = "One";
unordered[2] = "Two";
// 输出有序映射的内容
for (auto& pair : ordered) {
std::cout << pair.first << ": " << pair.second << "\n";
}
// 输出无序映射的内容
for (auto& pair : unordered) {
std::cout << pair.first << ": " << pair.second << "\n";
}
}
```
上述代码展示了如何分别向 `std::map` 和 `std::unordered_map` 添加相同的三个键值对并打印它们。可以看到前者总是以从小到大方式展示出来,而后者的输出顺序则是不确定的。
### 使用场景建议
- 当应用程序非常关注查询速度并且不需要考虑键之间相对位置的时候可以选择 `unordered_map`.
- 如果程序逻辑里涉及到频繁利用已经排好序这一性质来做进一步计算的话那么就应该优先选用 `map`.
阅读全文
相关推荐
















