1. 头文件
#include <unordered_map>
2. 定义
- 关联容器。无序map容器,无序是相对map容器来说的,unordered_map不会自动按照键排序
- 存储键值对key-value,通过key索引value,不存在两个元素的键key一样,这是相对于multimap来说的
- 和unordered_set一样,底层采用防冗余哈希表hashTable实现,检索时间复杂度O(1),最差O(N),内存消耗大
- 容器模板类
template <class Key,
class Type,
class Hash = hash<Key>,
class Pred = equal_to<Key>,
class Alloc = allocator<pair<const Key, Type>>
> class unordered_map;
3. 对象创建
方法 | 说明 |
---|
unordered_map<string, string> uMap; | 创建空容器 |
unordered_map<string, string> uMap{{“cpp”, “cpp.learning.org”}}; | 创建时初始化 |
unordered_map<string, string> map2(map1); | 通过其他容器初始化 |
unordered_map<string, string> map2(++map1.begin(), map1.end()); | 拷贝部分键值对 |
4. 常用方法
方法 | 说明 |
---|
myMap.size() | 容器中元素个数 |
myMap.max_size() | 容器所能容纳的最大元素个数,不同系统不一样 |
myMap.empty() | 容器是否为空 |
方法 | 说明 |
---|
pair< unordered_map<int, string>::iterator, bool> ret = myMap.emplace(key, value); | C11新增,效率比insert高;返回值是pair数据类型,iterator表示插入元素的迭代器,如果key相同指向相同key对应的迭代器,bool表示插入成功与否 |
iterator = myMap.emplace_hint(ite, key, value); | C11,ite为建议插入元素的位置,不一定被容器采纳,返回值是新插入元素的迭代器,或为相同key的迭代器 |
方法 | 说明 |
---|
pair<iterator, bool> ret = myMap.insert(pair<keyType, valueType>(key, value)); | 方式1 |
pair<iterator, bool> ret = myMap.insert(make_pair(key, value)); | 方式2 |
iterator ret = myMap.insert(iterator, pair<keyType, valueType>); | 方式3 |
void myMap.insert(anotherMap.first, anotherMap.last); | 方式4,[first, last) |
void myMap.insert({{“Alice”, 21}, {“Bob”, 22}, {“Clark”, 23}}); | 方式5,同时添加多个键值对,注意{{}, {}, {}} |
方法 | 说明 |
---|
size_type count = myMap.erase(const keyType& key); | 删除键为key的键值对,返回删除键值对的数量 |
iterator ite = myMap.erase(iterator); | 删除迭代器指向的键值对,返回后一个位置的迭代器 |
iterator ite = myMap.erase(first, last); | 删除[first, last)迭代器返回内的元素,返回最后一个被删除键值对后一个位置的迭代器 |
void myMap.clear(); | 清空容器 |
方法 | 说明 |
---|
map1.swap(map2); | 方式1 |
void swap(map1, map2); | 方式2 |
方法 | 说明 |
---|
操作符访问:[] | 容器重载了operator [],不存在会添加key的一个元素 |
valueType = myMap.at(key); | at方式访问,不存在会抛出out_of_range异常 |
方法 | 说明 |
---|
myMap.find(key) | 返回迭代器,无效返回end() |
myMap.count(key) == 0 | 键值对个数,0或1,因为unordered_map不允许重复key存在 |
方法 | 说明 |
---|
begin()/end() | 正向迭代器 |
cbegin()/cend() | const正向迭代器 |
方法 | 说明 |
---|
bucket_count() | 桶的数量 |
max_bucket_size() | 当前系统底层最多使用多少桶 |
bucket_size(n) | 返回第n个桶中键值对数量 |
bucket(key) | 返回以key为键的键值对所在桶的编号 |
rehash(n) | 将当前容器底层使用桶的个数设置为n |
参考文章
unordered_map容器的定义和方法
推荐,unordered_map容器方法实例
unordered_map的insert方法
created by shuaixio, 2021.06.22