unordered_map 是 C++11 引入的关联容器,底层采用哈希表结构,可以实现平均常数时间复杂度的插入、删除和查找。实际开发中我们经常需要操作这个容器,因此了解它的成员函数非常关键。下面介绍 unordered_map 最常见的几类函数以及具体用法。
元素插入相关函数
向 unordered_map 中插入元素可以使用 insert 函数,也可以使用下标运算符,还可以用 emplace 直接构造元素。
#include <iostream>
#include <unordered_map>
#include <string>
int main() {
std::unordered_map<std::string, int> mp;
// 使用 insert 插入 pair
mp.insert(std::make_pair("apple", 3));
// 使用下标插入或更新
mp["banana"] = 5;
// 使用 emplace 原地构造
mp.emplace("pear", 8);
std::cout << mp["apple"] << std::endl;
return 0;
}
查找与统计函数
查找元素时常用 find 和 count。find 返回迭代器,若未找到则等于 end();count 返回键是否存在,因为键唯一所以结果只能是 0 或 1。
#include <unordered_map>
#include <string>
#include <iostream>
int main() {
std::unordered_map<std::string, int> mp = {{"a", 1}, {"b", 2}};
// 使用 find 查找
auto it = mp.find("a");
if (it != mp.end()) {
std::cout << "found: " << it->second << std::endl;
}
// 使用 count 判断是否存在
if (mp.count("b") > 0) {
std::cout << "b exists" << std::endl;
}
return 0;
}
删除与清空函数
删除元素可以使用 erase,它支持通过键、迭代器或者区间来删除。清空整个容器则调用 clear。
#include <unordered_map>
#include <string>
int main() {
std::unordered_map<std::string, int> mp = {{"x", 10}, {"y", 20}};
// 按键删除
mp.erase("x");
// 按迭代器删除
auto it = mp.find("y");
if (it != mp.end()) {
mp.erase(it);
}
// 清空容器
mp.clear();
return 0;
}
容量与遍历函数
size 返回元素个数,empty 判断是否为空。遍历时可以用范围 for 循环,也可以使用迭代器。
#include <unordered_map>
#include <string>
#include <iostream>
int main() {
std::unordered_map<std::string, int> mp = {{"a", 1}, {"b", 2}};
std::cout << "size: " << mp.size() << std::endl;
std::cout << "empty: " << mp.empty() << std::endl;
for (const auto& kv : mp) {
std::cout << kv.first << " = " << kv.second << std::endl;
}
return 0;
}
桶相关函数
由于 unordered_map 基于哈希表,它还提供桶级别的函数,如 bucket_count、load_factor 等,方便观察哈希状态。
| 函数名 | 作用 |
|---|---|
| bucket_count() | 返回当前桶的数量 |
| load_factor() | 返回当前负载因子 |
| max_load_factor() | 获取或设置最大负载因子 |
合理运用上述 unordered_map 的函数,可以让我们在 C++ 中高效管理键值映射,减少不必要的查找开销。
unordered_mapC++容器哈希表修改时间:2026-07-27 15:15:30