我给你做一份最完整、最实用、面试必问 的 map 全家桶总结,包含:map / unordered_map / multimap / unordered_multimap
一、map 是什么?
STL map 是一种 key-value 键值对容器,key 唯一,自动排序,快速查找。 你可以把它理解为:一本自动排序、不重复、能快速查字的字典。
二、4 种 map 对比(最重要!)
表格
| 容器 | 底层 | 排序 | key 重复 | 查找速度 | 适用场景 |
|---|---|---|---|---|---|
| map | 红黑树 | 自动升序 | 不允许 | O(log n) | 需要有序、稳定 |
| unordered_map | 哈希表 | 无序 | 不允许 | O(1) | 追求最快查找 |
| multimap | 红黑树 | 自动升序 | 允许 | O(log n) | 一对多关系 |
| unordered_multimap | 哈希表 | 无序 | 允许 | O(1) | 一对多 + 超快查找 |
三、map 核心用法(最常用)
1. 创建 + 插入
cpp
运行
#include <map>
using namespace std;
map<int, string> mp;
// 插入
mp[1] = "张三";
mp.insert({2, "李四"});
2. 遍历
cpp
运行
for (auto& p : mp) {
cout << p.first << " " << p.second << endl;
}
3. 查找
cpp
运行
auto it = mp.find(1);
if (it != mp.end()) {
cout << it->second;
}
4. 删除
cpp
运行
mp.erase(1);
5. 常用函数
size():数量empty():是否为空clear():清空count(key):判断 key 是否存在
四、unordered_map 用法(最快!)
和 map 用法完全一样,只是:
- 无序
- 查找更快
- C++11 及以上支持
cpp
运行
#include <unordered_map>
unordered_map<int, string> ump;
五、multimap(key 可重复)
适合 一个键对应多个值
cpp
运行
multimap<int, string> mmp;
mmp.insert({1, "A"});
mmp.insert({1, "B"}); // 允许重复key
六、最关键的选择指南(面试 / 项目必背)
- 需要有序 → map
- 需要最快速度 → unordered_map
- key 可重复 → multimap
- key 可重复 + 超快 → unordered_multimap