实现原理
unordered_map
在 C++ 标准库中的实现基于哈希表(Hash Table)数据结构。哈希表通过一个哈希函数将键转换为数组的索引,然后在对应的桶(buckets)中存储元素。当多个键映射到相同的哈希值时,通常采用链地址法解决冲突,即在每个桶内使用链表存储多个元素。
常用操作
#include <unordered_map>
using namespace std;// 创建一个空的 unordered_map,键值类型为 string,值类型为 int
unordered_map<string, int> myMap;// 插入元素
myMap["apple"] = 10; // 直接插入
myMap.insert({"banana", 20}); // 使用 insert 函数插入
// 查找元素
if (myMap.find("apple") != myMap.end()) {cout << "apple's value: " << myMap["apple"] << endl;
}// 更新元素
myMap["apple"] = 30; // 直接更新// 删除元素
myMap.erase("apple");// 遍历 unordered_map
for (const auto &pair : myMap) {cout << pair.first << ": " << pair.second << endl;
}
特性及应用
- 无序性:
unordered_map
中的元素顺序是不确定的,不保证按照任何特定的顺序排列。 - 唯一键:键必须是唯一的,尝试插入具有相同键的元素不会更改已有元素的值,而是直接忽略该插入操作。
- 高效查找:平均情况下,插入、删除和查找操作的时间复杂度都是 O(1),取决于哈希函数的质量以及负载因子(bucket 数量与实际元素数量的比例)。
- 应用:常用于需要快速根据键查找值的场景,例如缓存、词频统计等。
相关容器及区别
-
map
:C++ 标准库中的另一种关联容器,同样以键值对的形式存储元素,但其底层实现是红黑树,因此它保持了键的排序顺序,查找、插入和删除操作的平均时间复杂度为 O(log n)。 -
unordered_multimap
:类似于unordered_map
的变体,允许键有重复,并且对应多个值。而在unordered_map
中,每个键都只能对应一个值。
总结来说,unordered_map
是一个高效的无序键值对容器,适合于不需要维持键的顺序且重视查找速度的应用场景。