17370845950

c++ unordered_map怎么用 c++哈希表用法【教程】
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::unordered_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++ 已内置特化,无需额外处理。