unordered_map 容器
unordered_map 是 C++ 标准库中的一个容器,它提供了基于哈希表的键值对映射。
unordered_map 的主要特点是它提供了平均时间复杂度为 O(1) 的查找、插入和删除操作。以下是 unordered_map 的一些主要成员函数:
构造函数:
-
unordered_map():默认构造函数,创建一个空的 unordered_map。
unordered_map<int,int> coordinate;
-
unordered_map(initializer_list):使用初始化列表创建一个 unordered_map。
unordered_map<std::string, int> my_map = { {"apple", 2}, {"banana", 3}, {"orange", 4} };
需要特别注意的是
:当我们初始化一个unordered_map的时候,必须提供关键字类型和值的类型。我们将每个关键字-值对包围在花括号中
,注意是花括号,不是小括号!!!
,{key,value}
pair类型的基础知识
- 因为unordered_map中元素的类型其实是一个pair类型。一个pair类型会保存两个数据成员。我觉得大家如果对pair类型的基础知识不牢固的话,可以去看看我的这篇文章:
- C++ pair类型详细介绍
迭代器相关:
- begin():返回指向容器中第一个元素的迭代器。
- end():返回指向容器中最后一个元素之后的迭代器。
- cbegin():返回一个指向容器中第一个元素的常量迭代器。
- cend():返回一个指向容器中最后一个元素之后的常量迭代器。
容量相关:
- empty():检查容器是否为空。
- size():返回容器中元素的数量。
- max_size():返回容器可以容纳的最大元素数量。
访问元素(下标操作)
unordered_map下标运算符接受一个索引(即,一个关键字(key)),获取与此关键字对应的值。
但是,与其他下标运算符不同的是,如果关键字不在unordered_map中,则会为它创建一个对应的关键字然后插入到map中,这个关键字对应的值会进行值初始化。
- operator[]:通过键访问对应的值,如果键不存在,则插入一个具有默认值的键值对。
- at():通过键访问对应的值,如果键不存在,则抛出 out_of_range 异常。
修改容器(添加元素,删除元素,清空容器)
添加元素
-
以下是一个示例,展示了向 unordered_map 中添加元素的几种方式:
int main() { unordered_map<string, int> data; // 方式1: 使用下标运算符[],如果键不存在,则插入新元素 data["apple"] = 5; // 方式2: 使用insert()函数插入一个pair类型的对象 data.insert(pair<string, int>("banana", 3)); // 方式3: 使用insert()函数插入一个make_pair()生成的键值对 data.insert(make_pair("orange", 7)); // 方式4: 使用insert()函数插入一个初始化列表表示的键值对 data.insert({"grape", 2}); // 方式5: 使用emplace()函数直接构造键值对并插入 data.emplace("pear", 4); }
-
在这个示例中,我们展示了向 unordered_map 中添加元素的五种方式:
- 使用下标运算符 [] 直接为给定的键分配一个值。如果键不存在,unordered_map 会自动创建一个新元素并将其插入到容器中。
- 使用 insert() 函数插入一个 pair 类型的对象。
- 使用 insert() 函数插入一个 make_pair() 生成的键值对。
- 使用 insert() 函数插入一个初始化列表表示的键值对。
- 使用 emplace() 函数直接构造键值对并插入。这种方法可以避免不必要的临时对象创建和拷贝,从而提高性能。
-
在这个示例中,我们同时展示了这五种方法,并使用范围 for 循环遍历 unordered_map 中的所有元素,输出它们的键和值。
删除一个元素
- erase():从容器中删除一个键值对。
清空容器
- clear():清除容器中的所有元素。
查找
- find():查找具有指定键的元素,并返回指向该元素的迭代器。如果没有找到,则返回指向 end() 的迭代器。
- count():返回具有指定键的元素数量。
哈希策略
- load_factor():返回当前的负载因子。
- max_load_factor():返回或设置最大负载因子。
- rehash():设置存储桶的数量,以便容纳至少指定数量的元素。
- reserve():将存储桶的数量设为至少容纳指定数量的元素,不超过最大负载因子。
观察器
- hash_function():返回当前使用的哈希函数对象。
- key_eq():返回当前使用的键比较函数对象。
比较运算符
- operator==:比较两个 unordered_map 是否相等。
- operator!=:比较两个 unordered_map 是否不相等。
可以用于 unordered_map的非成员函数
这些函数的详细信息和用法可以在 C++ 文档中找到。当然除了这些成员函数之外,C++ 标准库还提供了一些非成员函数,可以用于 unordered_map:
交换:
- std::swap():交换两个 unordered_map 容器的内容。
分配器相关:
- std::allocator_traits:提供了一种通用的方式来操作 unordered_map 的分配器。
特化 std::hash:
- std::hash:为内置类型和用户定义类型提供哈希函数的特化。
特化 std::swap:
- std::swap:在 std 命名空间中为 unordered_map 提供 swap() 函数的特化。
注意,这些函数和特化可能需要包括 <utility>、<memory> 和 <functional>
等头文件。
在实际使用中,你可能不需要所有这些成员和非成员函数。了解它们的基本用途和功能有助于你更有效地利用 unordered_map。在需要详细了解某个函数时,可以查阅 C++ 文档或参考相关教程。