unordered_map 是 C++11 引入的哈希表容器,平均 O(1) 时间复杂度支持增删查改;需包含 头文件,声明如 std::unordered_map m; 支持初始化、迭代器查找、count 判断存在性及范围 for 遍历。
unordered_map 是 C++11 引入的标准哈希表容器,底层基于哈希实现,支持平均 O(1) 时间复杂度的插入、查找和删除。它用键(key)快速映射到值(value),不保证元素顺序,适合需要高效随机访问的场景。
怎么声明和初始化 unordered_map
头文件必须包含 #include ,同时需指定 key 和 value 的类型:
- 空表:`std::unor
dered_map myMap;`
- 带初始值:`std::unordered_map<:string int> count{{"a", 1}, {"b", 2}};`
- 从另一个 map 构造:`std::unordered_map copyMap(originalMap);`
常用操作:增、查、改、删
核心接口简洁直观,和 map 类似但性能更好(无序):
-
插入/更新:`myMap[key] = value;` 或 `myMap.insert({key, value});`(后者失败时不覆盖)
-
查找:`auto it = myMap.find(key);` 返回迭代器,查不到时为 `myMap.end()`;也可直接用 `myMap.at(key)`(越界抛异常)或 `myMap[key]`(不存在则默认构造并插入)
-
判断是否存在:`if (myMap.count(key)) { ... }` —— count 返回 0 或 1
-
删除:`myMap.erase(key);` 或 `myMap.erase(it);`
遍历和获取大小
因为是无序容器,遍历顺序不确定,但语法和其他容器一致:
- 范围 for 循环:
for (const auto& p : myMap) { std::cout "
- 迭代器方式:
for (auto it = myMap.begin(); it != myMap.end(); ++it) { ... }
- 元素个数:`myMap.size()`;是否为空:`myMap.empty()`
自定义类型作 key 的注意事项
如果要用自定义 struct/class 当 key,必须提供两个东西:
- 一个 哈希函数对象(重载
operator() 的类,返回 size_t)
- 一个 相等比较函数(通常重载
operator==)
- 然后把它们作为第 3、4 个模板参数传入,例如:
std::unordered_map m;
对 string、int、double 等内置或标准类型,C++ 已内置特化,无需额外处理。