【STL——unordered_map】

unordered_map

unordered_map 是 C++ STL 中的一个关联容器,它是哈希表的一种实现。unordered_map 提供了平均 O(1) 时间复杂度的 key-value 存储和查找操作,并支持快速插入、删除和遍历元素的功能。它与 map 相比,具有更高的插入、查找效率,但是不支持按照 key 进行排序。

概述

unordered_map 是 C++ STL 中的一个关联容器,它采用哈希表的实现方式,提供了高效的 key-value 存储和查找功能。它的特点是:

  • 支持快速插入、删除和遍历元素;
  • 平均时间复杂度为 O(1);
  • 不支持按照 key 进行排序。

头文件和命名空间

在使用 unordered_map 之前,需要包含头文件 <unordered_map>,并且使用命名空间 std

#include <unordered_map>
using namespace std;

定义和初始化

定义一个 unordered_map 对象的语法如下所示:

unordered_map<key_type, value_type> myMap;

其中,key_typevalue_type 分别代表键和值类型。例如:

unordered_map<string, int> myMap;

上述代码定义了一个 unordered_map 对象,它的键为字符串类型,值为整数类型。

可以使用以下方法对 unordered_map 对象进行初始化:

默认初始化

unordered_map<key_type, value_type> myMap;

列表初始化

unordered_map<key_type, value_type> myMap = {
    
     {
    
    key1, value1}, {
    
    key2, value2}, ... };

其中,key1key2value1value2 分别代表键和值的具体内容。

unordered_map<string, int> myMap = {
    
     {
    
    "apple", 3}, {
    
    "banana", 2}, {
    
    "orange", 4} };

上述代码定义了一个 unordered_map 对象,它包含三个元素,分别是 “apple”,“banana” 和 “orange”。

复制初始化

unordered_map<key_type, value_type> myMap(anotherMap);

其中,anotherMap 是另一个 unordered_map 对象。

unordered_map<string, int> myMap(anotherMap);

上述代码定义了一个 unordered_map 对象,它与另一个 unordered_map 对象 anotherMap 相同。

元素访问

unordered_map 中的元素是按照 key-value 的形式存储的。可以使用如下方式访问元素:

at

cmyMap.at(key);

其中,key 是要查找的键。

c++复制代码unordered_map<string, int> myMap = {
    
     {
    
    "apple", 3}, {
    
    "banana", 2}, {
    
    "orange", 4} };
int num = myMap.at("apple");

上述代码定义了一个 unordered_map 对象,然后使用 at 方法查找键为 “apple” 的值,并将结果赋值给变量 num

[]

myMap[key] = value;

其中,key 是要访问的键,value 是要设置的值。

unordered_map<string, int> myMap;
myMap["apple"] = 3;
int num = myMap["apple"];

上述代码定义了一个 unordered_map 对象,然后使用 [] 运算符将键 “apple” 的值设置为 3,并将结果赋值给变量 num

find

myMap.find(key);

其中,key 是要查找的键。

unordered_map<string, int> myMap = {
    
     {
    
    "apple", 3}, {
    
    "banana", 2}, {
    
    "orange", 4} };
auto it = myMap.find("apple");
if (it != myMap.end()) {
    
    
    int num = it->second;
}

上述代码定义了一个 unordered_map 对象,然后使用 find 方法查找键为 “apple” 的值。如果找到了,就将其赋值给迭代器 it,然后通过 it->second 访问该元素的值。注意,需要检查迭代器是否等于 end(),以确定是否找到了元素。

元素插入和删除

可以使用如下方式向 unordered_map 中插入和删除元素:

插入

使用 insert 方法向 unordered_map 中插入元素:

myMap.insert({
    
    key, value});

其中,keyvalue 分别代表要插入的键和值。

unordered_map<string, int> myMap = {
    
     {
    
    "apple", 3}, {
    
    "banana", 2} };
myMap.insert({
    
    "orange", 4});

上述代码定义了一个 unordered_map 对象,并向其插入另一个元素 “orange”。

删除

使用 erase 方法从 unordered_map 中删除元素:

myMap.erase(key);

其中,key 是要删除的键。

unordered_map<string, int> myMap = {
    
     {
    
    "apple", 3}, {
    
    "banana", 2}, {
    
    "orange", 4} };
myMap.erase("banana");

上述代码定义了一个 unordered_map 对象,并从中删除了键为 “banana” 的元素。

遍历

可以使用如下方式遍历 unordered_map 中的元素:

迭代器

使用迭代器 begin()end() 来实现遍历:

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

上述代码使用迭代器遍历 unordered_map 中的每一个元素。其中,it->firstit->second 分别代表当前迭代器指向元素的键和值。

C++11 范围遍历

使用 C++11 中的范围遍历来实现遍历:

for (auto& [key, value] : myMap) {
    
    
    cout << key << " " << value << endl;
}

上述代码使用 C++11 范围遍历遍历 unordered_map 中的每一个元素。其中,[key, value] 分别代表当前迭代器指向元素的键和值。

性能

unordered_map 的平均时间复杂度为 O(1),在插入、查找、删除、遍历等方面都具有较高的效率。但是,考虑到其内部实现是哈希表,而哈希表的性能受到哈希函数和负载因子的影响,所以在实际使用中需要注意调整哈希函数和负载因子的值以达到最佳性能。

猜你喜欢

转载自blog.csdn.net/muzillll/article/details/131039727