📅  最后修改于: 2023-12-03 15:37:34.578000             🧑  作者: Mango
unordered_map是C++ STL(标准模板库)中的容器之一,在头文件<unordered_map>中定义。unordered_map是一个关联式容器,它将每个键映射到唯一值。
与普通的map相比,unordered_map更适用于需要快速查找和插入元素的情况。它使用哈希表实现,哈希表是一个根据键直接访问值的数据结构,因此可以在几乎恒定的时间内找到和插入元素。
unordered_map的关键特性包括:
使用unordered_map之前,需要包含<unordered_map>头文件,并使用using命令指定命名空间std来避免使用std::前缀。
下面是一个简单的示例程序,演示unordered_map的基本用法:
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
unordered_map<string, int> map;
// 插入键值对
map["apple"] = 3;
map["banana"] = 2;
map.insert({"orange", 4});
// 查找键对应的值
cout << "apple: " << map["apple"] << endl;
// 遍历所有键值对
for (auto it = map.begin(); it != map.end(); ++it) {
cout << it->first << ": " << it->second << endl;
}
return 0;
}
输出结果为:
apple: 3
banana: 2
orange: 4
该程序创建了一个unordered_map对象,然后插入了三个键值对。可以通过[]运算符或insert()方法插入键值对。键值对的类型必须与容器声明时指定的类型匹配。
对于查找操作,可以使用[]运算符获取键对应的值。如果键不存在,会自动添加一个默认值并返回。也可以使用find()方法进行查找,它返回一个迭代器,指向键值对的位置。
最后,遍历所有键值对可以使用迭代器。对于unordered_map,迭代器指向键值对的位置,可以通过迭代器的first和second成员访问键和值。
默认情况下,unordered_map使用std::hash模板类作为哈希函数,该模板类只定义了基本类型的哈希函数,而对于自定义类型,则需要手动实现一个哈希函数。
下面是一个自定义哈希函数的示例,用于计算字符串的哈希值:
struct StringHash {
size_t operator()(const string& s) const {
size_t hash = 0;
for (char c : s) {
hash = hash * 31 + c;
}
return hash;
}
};
该哈希函数将字符串中每个字符的ASCII码值乘以一个质数31,并加上之前计算的哈希值。可以根据实际需求选择其他的质数。
使用自定义哈希函数创建unordered_map,只需要在容器声明中指定哈希函数即可:
unordered_map<string, int, StringHash> map;
完整的程序示例:
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
struct StringHash {
size_t operator()(const string& s) const {
size_t hash = 0;
for (char c : s) {
hash = hash * 31 + c;
}
return hash;
}
};
int main() {
unordered_map<string, int, StringHash> map;
// 插入键值对
map["apple"] = 3;
map["banana"] = 2;
map.insert({"orange", 4});
// 查找键对应的值
cout << "apple: " << map["apple"] << endl;
// 遍历所有键值对
for (auto it = map.begin(); it != map.end(); ++it) {
cout << it->first << ": " << it->second << endl;
}
return 0;
}
unordered_map是一种非常实用的C++ STL容器,可以用于快速查找和插入唯一键值对。了解它的基本用法,以及如何使用自定义哈希函数,可以让程序员编写更高效、更灵活的代码。