📅  最后修改于: 2023-12-03 15:05:45.965000             🧑  作者: Mango
unordered_map
是C++标准库中的一个关联容器,它使用哈希表实现,能够提供高效的查找、插入、删除操作,因此在处理大量数据时比较实用。
unordered_map
与map
非常相似,不同之处在于前者的元素是无序的,而后者是有序的。另一个区别是,unordered_map
的元素类型pair
中的第一个元素可以是非整数类型(即自定义类型),而map
中的元素必须都是按照某种规则排序的键值对。因此,unordered_map
比map
更加通用化,可以应对更多的场景。
使用unordered_map
需要引入<unordered_map>
头文件。如果同时需要使用pair
类型,还需要引入<utility>
头文件。
#include <unordered_map>
以下是定义一个unordered_map
对象的基本语法。
std::unordered_map<key_type, value_type> m;
其中,key_type
表示键的类型,value_type
表示值的类型。你还可以在定义时提供一些可选的参数,如哈希函数、相等比较函数等。例如:
struct my_hash {
std::size_t operator() (const std::string& s) const { /* 哈希函数实现 */ }
};
std::unordered_map<std::string, int, my_hash> m;
在上面的代码中,我们通过定义了一个名为my_hash
的哈希函数,并将它作为unordered_map
对象的第三个参数传入。这样就可以使用自定义的哈希函数对std::string
类型的键进行哈希。
可以使用insert()
方法向unordered_map
中插入一个键值对,例如:
std::unordered_map<std::string, int> m;
m.insert({"apple", 2}); // 两种写法都可以
m.insert(std::make_pair("banana", 3));
也可以使用下标运算符[]
进行插入:
m["orange"] = 4;
如果键不存在,则会自动创建一个键值对,并将值设为默认值。
可以使用at()
方法或下标运算符[]
来访问unordered_map
中的元素。例如:
std::unordered_map<std::string, int> m = {{"apple", 2}, {"banana", 3}, {"orange", 4}};
int a = m.at("apple");
int b = m["banana"];
std::cout << "a = " << a << ", b = " << b << std::endl;
还可以使用find()
方法来查找指定键是否存在,并返回一个指向对应元素的迭代器。如果不存在,则该方法返回unordered_map
对象的end()
迭代器。例如:
auto it = m.find("banana");
if (it != m.end()) {
std::cout << "banana = " << it->second << std::endl;
} else {
std::cout << "banana not found" << std::endl;
}
可以使用erase()
方法删除unordered_map
中的指定元素或指定键的元素。例如:
std::unordered_map<std::string, int> m = {{"apple", 2}, {"banana", 3}, {"orange", 4}};
m.erase("banana");
// 或者
auto it = m.find("banana");
if (it != m.end()) {
m.erase(it);
}
可以使用迭代器对unordered_map
进行遍历,例如:
std::unordered_map<std::string, int> m = {{"apple", 2}, {"banana", 3}, {"orange", 4}};
for (auto it = m.begin(); it != m.end(); ++it) {
std::cout << it->first << " = " << it->second << std::endl;
}
还可以使用for
循环和auto
关键字来简化遍历操作:
for (const auto& p : m) {
std::cout << p.first << " = " << p.second << std::endl;
}
unordered_map
是C++标准库中非常常用的一个关联容器,它可以提供快速的插入、查找、删除操作,适合处理大量数据。在使用时,需要注意合理选择哈希函数和键类型,以及处理键不存在的情况。