📜  unordered_map 头文件 c++ (1)

📅  最后修改于: 2023-12-03 15:05:45.965000             🧑  作者: Mango

unordered_map头文件介绍

简介

unordered_map是C++标准库中的一个关联容器,它使用哈希表实现,能够提供高效的查找、插入、删除操作,因此在处理大量数据时比较实用。

unordered_mapmap非常相似,不同之处在于前者的元素是无序的,而后者是有序的。另一个区别是,unordered_map的元素类型pair中的第一个元素可以是非整数类型(即自定义类型),而map中的元素必须都是按照某种规则排序的键值对。因此,unordered_mapmap更加通用化,可以应对更多的场景。

用法
头文件

使用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++标准库中非常常用的一个关联容器,它可以提供快速的插入、查找、删除操作,适合处理大量数据。在使用时,需要注意合理选择哈希函数和键类型,以及处理键不存在的情况。