1. unordered 系列关联式容器
在 C++98
中,STL
提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到
logN,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在 C++11
中,STL
又提供了 4 个 unordered
系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,本文中只对 unordered_map
和 unordered_set
进行介绍,unordered_multimap
和 unordered_multiset
可查看文档介绍。
2. unordered_map
2.1 unordered_map 的文档介绍
unordered_map在线文档说明
翻译:
unordered_map
是存储 <key, value>
键值对的关联式容器,其允许通过 keys
快速的索引到与其对应的 value
- 在
unordered_map
中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。和映射值的类型可能不同
- 在内部,
unordered_map
没有对 <kye, value>
按照任何特定的顺序排序, 为了能在常数范围内找到 key
所对应的 value,unordered_map
将相同哈希值的键值对放在相同的桶中
unordered_map
容器通过 key
访问单个元素要比 map
快,但它通常在遍历元素子集的范围迭代方面效率较低。
unordered_maps
实现了直接访问操作符<\font> (operator[])
,它允许使用 key
作为参数直接访问 value
- 它的迭代器至少是前向迭代器
2.2 unordered_map 的接口说明
unordered_map
的构造
函数声明
|
功能介绍 |
unordered_map |
构造不同格式的unordered_map对象 |
unordered_map
的容量
函数声明
|
功能介绍 |
bool empty() const |
检测unordered_map是否为空 |
size_t size() const |
获取unordered_map的有效元素个数 |
unordered_map
的迭代器
函数声明
|
功能介绍 |
begin |
返回unordered_map第一个元素的迭代器 |
end |
返回unordered_map最后一个元素下一个位置的迭代器 |
cbegin |
返回unordered_map第一个元素的const迭代器 |
cend |
返回unordered_map最后一个元素下一个位置的const迭代器 |
unordered_map
的元素访问
函数声明
|
功能介绍 |
operator[] |
返回与key对应的value,没有一个默认值 |
注意:
- 该函数中实际调用哈希桶的插入操作,用参数
key
与 V()
构造一个默认值往底层哈希桶中插入,如果 key
不在哈希桶中,插入成功,返回 V()
,插入失败,说明 key
已经在哈希桶中,将 key
对应的 value
返回。
map、unordered_map
支持 [ ]
重载,这就使得它变得非常方便,而multimap、set
等不支持的容器就很不方便。
unordered_map
的查询
函数声明
|
功能介绍 |
iterator find(const K& key) |
返回key在哈希桶中的位置 |
size_t count(const K& key) |
返回哈希桶中关键码为key的键值对的个数 |
注意:
unordered_map
中 key
是不能重复的,因此 count
函数的返回值最大为 1
unordered_map
的修改操作
函数声明
|
功能介绍 |
insert |
向容器中插入键值对 |
erase |
删除容器中的键值对 |
void clear() |
清空容器中有效元素个数 |
void swap(unordered_map&) |
交换两个容器中的元素 |
unordered_map
的桶操作
函数声明
|
功能介绍 |
size_t bucket_count()const |
返回哈希桶中桶的总个数 |
size_t bucket_size(size_t n)const |
返回n号桶中有效元素的总个数 |
size_t bucket(const K& key) |
返回元素key所在的桶号 |
3. unordered_set
3.1 unordered_set 的文档介绍
unordered_set在线文档说明
3.2 unordered_set 的接口说明
参考官方文档即可,在此不再赘述过多:unordered_set在线文档说明。