1. 简介
从 C++ 11 开始,hash_map 实现已被添加到标准库中,但为了防止与已有的代码存在冲突,决定使用替代名称 unordered_map。这个名字其实更具描述性,因为说明了该类元素的无序性。
- unordered_map记录元素的hash值,根据hash值判断元素是否相同
- map相当于java中的TreeMap,unordered_map相当于HashMap
- 查找、插入效率:unordered_map的效率都优于hash_map,更优于map
- 空间复杂度:hash_map最低,unordered_map次之,map最大。
与map的对比:
- 存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的
- map中的元素是按照二叉搜索树存储(用红黑树实现),进行中序遍历会得到有序遍历
与hash_map对比:
- unordered_map原来属于boost分支和std::tr1中,而hash_map属于非标准容器。
- unordered_map感觉速度和hash_map差不多,但是支持string做key,也可以使用复杂的对象作为key。
- unordered_map编译时gxx需要添加编译选项:–std=c++11
2. unordered_map实现原理
使用:hashtable + bucket
内部采用 hashtable 的数据结构存储,所以,每个特定的 key 会通过一些特定的哈希运算映射到一个特定的位置,每个哈希桶中可能没有元素,也可能有多个元素。
插入过程:
- 1、得到 key;
- 2、通过 hash 函数得到 hash 值;
- 3、得到桶号(一般都为 hash 值对桶数求模);
- 4、存放 key 和 value 在桶内(发生冲突,用比较函数解决)
取值过程:
- 1、得到 key
- 2、通过 hash 函数得到 hash 值
- 3、得到桶号(一般都为 hash 值对桶数求模)
- 4、比较桶的内部元素是否与 key 相等,若都不相等,则没有找到。
- 5、取出相等的记录的 value。
特点如下:
- 关联性:通过 key 去检索 value,而不是通过绝对地址(和顺序容器不同)
- 无序性:使用 hash 表存储,内部无序
- Map : 每个值对应一个键值(unordered_map<Key, Value> 的元素类型是 std::pair<const Key, Value>
- 键唯一性:不存在两个元素的 key 一样(unordered_multimap 可以存放相同相同 key)
- 动态内存管理:使用内存管理模型来动态管理所需要的内存空间
unordered_map 类的定义:
// 通常只用得到前两个 <Key, Ty>
template <class Key, //密钥类
class Ty, //映射类
class Hash = std::hash<Key>, // 哈希函数对象类
class Pred = std::equal_to<Key>, // 相等比较函数对象类
class Alloc = std::allocator<std::pair<const Key, Ty>>> // allocator 类
class unordered_map;
头文件:
#include <unordered_map>
成员函数:
迭代器---------------------------------------------------------------------------------------------------
begin 返回指向容器起始位置的迭代器(iterator)
end 返回指向容器末尾位置的迭代器
cbegin 返回指向容器起始位置的常迭代器(const_iterator)
cend 返回指向容器末尾位置的常迭代器
Capacity------------------------------------------------------------------------------------------------
size 返回有效元素个数
max_size 返回 unordered_map 支持的最大元素个数
empty 判断是否为空
元素访问------------------------------------------------------------------------------------------------
operator[] 访问元素
at 访问元素(如 m.at(5) = 3.33)
元素修改------------------------------------------------------------------------------------------------
insert 插入元素
erase 删除元素
swap 交换内容
clear 清空内容
emplace 构造及插入一个元素
emplace_hint 按提示构造及插入一个元素
操作-----------------------------------------------------------------------------------------------------
find 通过给定主键查找元素
count 返回匹配给定主键的元素的个数
equal_range 返回值匹配给定搜索值的元素组成的范围
Buckets------------------------------------------------------------------------------------------------
bucket_count 返回槽(Bucket)数
max_bucket_count 返回最大槽数
bucket_size 返回槽大小
bucket 返回元素所在槽的序号
load_factor 返回载入因子,即一个元素槽(Bucket)的最大元素数
max_load_factor 返回或设置最大载入因子
rehash 设置槽数
reserve 请求改变容器容量