✅ 1. 本质区别
特性 | std::map | std::unordered_map (哈希表) |
---|
数据结构 | 红黑树(平衡二叉搜索树) | 哈希表(Hash Table) |
键值对有序吗? | ✅ 有序(按 key 升序排列) | ❌ 无序(由哈希函数决定) |
查找/插入/删除时间复杂度 | O(log n) | 平均 O(1),最坏 O(n) |
使用的底层机制 | 树结构,自动排序 | 哈希函数 + 拉链法等冲突解决 |
✅ 2. C++ 中的具体类名
类型 | C++ STL 名称 | 属于哪个头文件 |
---|
有序 map | std::map | <map> |
无序 map(哈希表) | std::unordered_map | <unordered_map> |
✅ 3. 使用场景建议
场景 | 推荐使用 |
---|
需要按 key 排序遍历 | std::map |
只关注 key 的存在与否、查找效率 | std::unordered_map |
高频查找、插入的场景,如 LeetCode 的 two sum | std::unordered_map |
有大量数据,性能敏感 | std::unordered_map (但注意 hash 冲突) |
哈希函数的核心意义:加速查找(从 O(n) → O(1))
结论: 如果key不用排序,无脑用hashmap就行
操作复杂度对比表
容器类型 | 插入(Insert) | 查找(Find) | 更新(Update) | 是否有序 | 适用场景 |
---|
std::vector | O(1) 末尾O(n) 任意 | O(n) | O(n) | ❌ | 顺序存储,大量遍历/索引 |
std::list | O(1) 已知位置O(n) | O(n) | O(n) | ❌ | 频繁插入/删除,顺序不重要 |
std::map | O(log n) | O(log n) | O(log n) | ✅ | 有序映射,需要 key 排序 |
std::unordered_map | O(1) 平均O(n) 最坏 | O(1) 平均O(n) 最坏 | O(1) 平均O(n) 最坏 | ❌ | 快速 key-value 存储查找 |
使用选择建议
场景 | 推荐容器 |
---|
快速查找 key-value | unordered_map ✅ |
查找 + key 排序 | map ✅ |
按索引查 + 顺序处理 | vector ✅ |
频繁插入删除 + 顺序 | list ✅ |
情况 | 推荐容器 | 原因说明 |
---|
频繁遍历所有元素 | vector ✅ | 连续内存 + cache 友好 + 快速读取 |
频繁插入/删除中间元素 | list ✅ | 插入/删除 O(1),不用移动后续元素 |
查找元素是否存在(按 key) | unordered_map ✅ | 哈希查找快 |
vector list对比
对比点 | vector (数组) | list (链表) |
---|
内存布局 | 连续内存 | 非连续,节点分散 |
遍历方式 | 顺序访问,支持索引 | 通过指针跳转,每个节点跳一次 |
CPU cache 命中率 | 高(预取 + 缓存行友好) | 低(跳跃式访问,缓存失效) |
实际遍历性能 | 快得多,几乎是线性流式处理 | 明显慢,每个节点都需解引用指针访问 |