📜  C++ STL中的unordered_map终止(1)

📅  最后修改于: 2023-12-03 14:39:52.303000             🧑  作者: Mango

C++ STL中的unordered_map

在C++ STL(标准库)中,unordered_map是一种哈希表(hash table)的实现方式,用于存储一组键值对(key-value pairs)。unordered_map 中的键和值都可以是任何类型的,只要它们可以使用哈希函数进行计算和比较。

unordered_map的基本用法
创建unordered_map对象

使用unordered_map需要包含头文件<unordered_map>,创建unordered_map对象时必须指定键和值的类型:

#include <unordered_map>
using namespace std;

unordered_map<int, string> myMap;

上面的代码创建了一个空的unordered_map对象myMap,其中键类型为int,值类型为string。

插入元素

向unordered_map中插入键值对可以使用insert函数,也可以使用下标运算符[]:

// 使用insert函数插入键值对
myMap.insert(make_pair(1, "apple"));
myMap.insert(make_pair(2, "banana"));

// 使用下标运算符[]插入键值对
myMap[3] = "orange";
访问元素

使用下标运算符[]可以访问unordered_map中的元素:

cout << myMap[1] << endl; //输出"apple"
cout << myMap.at(2) << endl; //输出"banana"
遍历元素

unordered_map使用迭代器(iterator)遍历元素,可以使用auto关键字来简化类型定义:

for (auto it = myMap.begin(); it != myMap.end(); it++) {
  cout << it->first << ":" << it->second << endl;
}

上面的代码输出了unordered_map中所有的键值对。

删除元素

使用erase函数可以删除unordered_map中的元素:

myMap.erase(1);
myMap.erase(myMap.find(2), myMap.end()); //删除键为2及之后的所有元素
查询元素

可以使用count函数查询unordered_map中是否存在某个键,或者使用find函数查找某个键对应的迭代器:

if (myMap.count(1)) {
  cout << "key 1 exists" << endl;
}

auto it = myMap.find(2);
if (it != myMap.end()) {
  cout << "key 2 exists, value is " << it->second << endl;
}
unordered_map的底层实现

unordered_map内部使用哈希表(hash table)实现,每个键值对会被存储在一对哈希表中的槽位(slot)中。哈希表中的每个槽位可以存储多个键值对,当存在冲突(collision)时,会通过链表(linked list)将相同哈希值的键值对链接起来。

unordered_map使用哈希函数(hash function)将键值对映射为槽位中的索引值,使用equal_to函数比较键值对是否相等。由于哈希函数和比较函数的特性,unordered_map中的元素是无序的。

总结

unordered_map是C++ STL中哈希表的一种实现方式,可以用于存储任何类型的键值对。unordered_map的使用方式类似于map,但是由于哈希表的特性,unordered_map中的元素是无序的。unordered_map的底层实现使用了哈希表和链表,通过哈希函数将键值对映射为槽位中的索引值,使用equal_to函数比较键值对是否相等。