unordered_map是基于哈希表的C++关联容器,提供O(1)平均时间复杂度的查找、插入和删除操作,适用于无需排序的快速访问场景。

unordered_map 是 C++ STL 中提供的关联容器,用于存储键值对(key-value pairs),其底层基于哈希表实现,查找、插入和删除操作的平均时间复杂度为 O(1)。相比 map(基于红黑树,有序),unordered_map 无序但访问更快,适合需要快速查找的场景。
包含头文件与命名空间
使用 unordered_map 需要包含头文件
#include
#include
using namespace std;
基本定义与初始化
声明一个 unordered_map 的格式为:
unordered_map
常见用法示例:
立即学习“C++免费学习笔记(深入)”;
支持的初始化方式:
- 空初始化:直接定义后插入数据
- 列表初始化:unordered_map
ages = {{"Alice", 25}, {"Bob", 30}};
常用操作方法
以下是一些核心操作及对应函数:
-
插入元素:
- ageMap["Charlie"] = 35; // 使用下标插入或更新
- ageMap.insert({"David", 40}); // insert 方法插入 pair
- ageMap.emplace("Eve", 28); // 原地构造,效率更高
-
查找元素:
- auto it = ageMap.find("Alice"); // 返回迭代器,找不到返回 end()
- 判断是否存在:if (ageMap.count("Bob")) { /* 存在 */ }
-
访问元素:
- cout // 直接通过键访问值(若键不存在会自动创建)
- 更安全的方式是先 find 再访问,避免意外插入默认值
-
删除元素:
- ageMap.erase("Bob"); // 按键删除
- ageMap.erase(it); // 按迭代器删除
-
遍历所有元素:
for (const auto& pair : ageMap) {
cout } -
获取大小与清空:
- ageMap.size(); // 元素个数
- ageMap.empty(); // 是否为空
- ageMap.clear(); // 清空所有元素
完整示例代码
下面是一个完整的小程序演示 unordered_map 的典型用法:
#include#include
#include
using namespace std;
int main() {
unordered_map
{"Alice", 20},
{"Bob", 22},
{"Charlie", 19}
};
// 插入新元素
studentAges["David"] = 21;
// 查找并输出 Bob 的年龄
auto it = studentAges.find("Bob");
if (it != studentAges.end()) {
cout second
}
// 遍历输出所有学生信息
for (const auto& s : studentAges) {
cout
}
return 0;
}
注意事项
- 键类型必须支持哈希函数。C++ 内置类型(如 int、string)已提供 hash 实现,自定义类型需重载 hash 函数或提供仿函数。
- 不保证元素顺序,遍历时顺序可能每次不同。
- 使用下标访问不存在的键会自动插入该键并用默认值初始化(如 int 为 0),需注意逻辑错误。
- 多线程环境下需自行加锁保护,unordered_map 本身非线程安全。
基本上就这些。掌握 unordered_map 能显著提升查找效率,是算法题和工程开发中的常用工具。











