简介
unordered_map 为无序图,为为C++11引入的无序(哈希)容器,与 map 类似,都为键值对(Key-Value)容器
底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用hash函数对key进行映射到不同区域进行保存,且由于其基于哈希表,插入元素和查找的时间复杂度很低,为 O(1)
unordered_map 为关联式容器,底层为哈希表(Hash-Table)
类模板
1 | template< |
成员函数
迭代器
- begin() - 返回指向 unordered_map 个元素的迭代器
- end() - 返回指向 unordered_map 中最后一个元素之后的理论元素的迭代器
- cbegin() - 返回指向 unordered_map 中第一个元素的const迭代器
- cend() - 返回一个const迭代器,指向 unordered_map 中最后一个元素之后的理论元素
容量相关
- size() - 返回 unordered_map 中元素数 O(1)
- max_size() - 返回 unordered_map 可以容纳的最大元素数 O(1)
- empty() - 当前 unordered_map 是否为空 O(1)
修改器相关
- clear() - 清空所有元素,size()置 0
- insert() - 插入一个或多个元素到指定位置
- erase() - 删除指定位置元素
- swap() - 交换元素
- emplace() - 插入一个元素到指定位置,调用构造函数
- emplace_hint() - 插入新元素到容器中尽可能接近于恰在 hint 前的位置,调用构造函数
- try_emplace() - 若键不存在则原位插入,若键存在则不做任何事(包括拷贝构造) (C++17)
- insert_or_assign() - 插入元素,若存在则赋值 (C++17)
- extract() - 从另一容器释出结点 (C++17)
- merge() - 从另一容器接合结点 (C++17)
元素查找相关
- at[g] - 返回对 g 处元素的引用
- operator[g] - 返回 g 处元素或插入元素到 g 处
- count() - 返回匹配特定键的元素数量 O(1)
- find() - 寻找带有特定键的元素
- equal_range() - 返回匹配特定键的元素范围
- contains() - 检查容器是否含有带特定键的元素 (C++20)
桶接口
- begin(n) - 返回指向下标为 n 的桶首元素的迭代器
- end(n) - 返回指向下标为 n 的桶 中最后一个元素之后的理论元素的迭代器
- cbegin(n) - 返回指向下标为 n 的桶首元素的const迭代器
- cend(n) - 返回一个const迭代器,指向下标为 n 的桶 中最后一个元素之后的理论元素
- bucket_count() - 返回容器中的桶数
- max_bucket_count() - 返回容器能容纳桶的最大数量
- bucket_size(n) - 返回下标为 n 的桶中的元素数
- bucket(n) - 返回关键值为 n 的桶的下标
- load_factor() - 返回每个桶元素的平均数,即 size() 除以 bucket_count()
- max_load_factor(n) - 管理最大加载因子(每个桶的平均元素数)。若加载因子超出n,则容器自动增加桶数
- rehash(n) - 设置桶数为 n 并重哈希容器,若新的桶数使加载因子大于最大加载因子,则新桶数至少为 size() / max_load_factor()
- reserve(n) - 设置桶数为适应至少 count 个元素,而不超出最大加载因子所需的数,并重哈希容器,等价于 rehash(std::ceil(count / max_load_factor()))
unordered_map迭代器详解
unordered_map 的所有迭代器都是正向迭代器
const迭代器
unordered_map 所返回的迭代器都是 const 迭代器,只能对其操作,不能更改其指向的值,即:
1 | unordered_map<int, int>v{ {1,22},{3,44},{5,66},{7,88},{9,100} }; |
unordered_map特性
rehash后迭代器失效
在操作 unordered_map 容器过程中,如果容器的大小超过了最大容量,会触发 rehash ,导致迭代器失效