介绍
-
unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value。不同的是unordered_map不会根据key的大小进行排序
-
存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的,而map中的元素是按照二叉搜索树存储,进行中序遍历会得到有序遍历。
-
所以使用时map的key需要定义operator<。而unordered_map需要定义hash_value函数并且重载operator==。但是很多系统内置的数据类型都自带这些,
-
那么如果是自定义类型,那么就需要自己重载operator<或者hash_value()了。
-
如果需要内部元素自动排序,使用map,不需要排序使用unordered_map
-
使用cmake来辅助编译含有unordered_map的源码时,可能会报错说:
-
#error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.。
-
这表示unordered_map是c++11的标准,此时在cmakelist中加入SET( CMAKE_CXX_FLAGS “-std=c++11 -O3”)就可以编译过了。
-
用法
头文件
#include <unordered_map>
unordered_map声明及初始化
unordered_map基本操作
(1)迭代器
begin
- 返回指向容器起始位置的迭代器(iterator)
end
- 返回指向容器末尾位置的迭代器
cbegin
- 返回指向容器起始位置的常迭代器(const_iterator)
cend
- 返回指向容器末尾位置的常迭代器
(2)容量
size
- 返回有效元素个数
max_size
- 返回 unordered_map 支持的最大元素个数
empty
- 判断是否为空
(3)元素的访问
c[key]
- 访问元素
c.at(key)
- 访问元素
(4)元素的修改
insert
- 插入元素
erase
- 删除元素
swap
- 交换内容
clear
- 清空内容
emplace
- 构造及插入一个元素
emplace_hint
- 按提示构造及插入一个元素
(5)操作
find
- 通过给定主键查找元素,没找到:返回unordered_map::end()//这个很重要, leetcode上面一些题需要用这个特性
count
- 返回匹配给定主键的元素的个数
equal_range
- 返回值匹配给定搜索值的元素组成的范围
(6)Buckets
bucket_count
- 返回槽(Bucket)数
max_bucket_count
- 返回最大槽数
bucket_size
- 返回槽大小
bucket
- 返回元素所在槽的序号
load_factor
- 返回载入因子,即一个元素槽(Bucket)的最大元素数
max_load_factor
- 返回或设置最大载入因子
rehash
- 设置槽数
reserve
- 请求改变容器容量