unordered_map
是 C++ 标准库中的一种关联容器,它存储键值对,其中键是唯一的,并且通过哈希函数组织数据以允许快速的查找、插入和删除操作。unordered_map
的元素是无序的,因为它们是根据哈希值而不是排序顺序来组织的。
下面是 unordered_map
的基本用法:
定义和初始化
#include <iostream>
#include <string>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> map;
// 插入键值对
map["one"] = 1;
map["two"] = 2;
map["three"] = 3;
// 初始化列表
std::unordered_map<std::string, int> map2 = {
{"one", 1},
{"two", 2},
{"three", 3}
};
return 0;
}
访问元素
int value = map["one"]; // 获取键为 "one" 的值
遍历
for (const auto& pair : map) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
查找元素
auto it = map.find("two"); // 返回一个迭代器,指向键为 "two" 的元素
if (it != map.end()) {
std::cout << "Found: " << it->second << std::endl;
} else {
std::cout << "Not found" << std::endl;
}
删除元素
map.erase("one"); // 删除键为 "one" 的元素
哈希函数和比较函数
unordered_map
使用哈希函数来确定元素的存储位置,默认情况下,它会使用 <functional>
头文件中定义的 std::hash
。你也可以提供自定义的哈希函数和比较函数。
#include <functional>
struct CustomKey {
std::string first;
std::string second;
// 自定义比较函数
bool operator==(const CustomKey& other) const {
return first == other.first && second == other.second;
}
};
// 自定义哈希函数
struct CustomHash {
std::size_t operator()(const CustomKey& k) const {
return std::hash<std::string>()(k.first) ^ std::hash<std::string>()(k.second);
}
};
std::unordered_map<CustomKey, std::string, CustomHash> map;
在这个例子中,定义了一个自定义键类型 CustomKey
和一个自定义哈希函数 CustomHash
,它们必须重载 ==
运算符和哈希函数。
unordered_map
是一种高效的数据结构,适用于需要快速查找操作的场景,但它不保证元素的顺序。如果需要保持元素的插入顺序,可以使用 std::map
或 std::unordered_map
的有序版本 std::unordered_map<std::string, int, std::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<const std::string, int>>>
。