STL学习----入门(1)[unordered_map]
2015-08-24 18:23
211 查看
#include<unordered_map>:
C++11
无序映射表(Unordered Map)容器是一个存储以键值对组合而成的元素的关联容器(Associative container),容器中的元素无特别的次序关系。该容器允许基于主键地快速检索各个元素。
An unordered_map is an unordered associative container that supports unique keys (an unordered_map contains at most one of each key value) and that
associates values of another type mapped_type with the keys.
容器特性:
关联(Associative)
关联容器中的元素是通过主键(Key)而不是它们在容器中的绝对位置来引用的。
无序(Unordered)
无序容器通过 hash 表来组织它们的元素,允许通过主键快速地访问元素。
映射(Map)
每个元素为一个值(Mapped value)绑定一个键(Key):以主键来标志主要内容等于被映射值的元素。
键唯一(Unique keys)
容器中不存在两个元素有相同的主键。
能够感知内存分配器的(Allocator-aware)
容器使用一个内存分配器对象来动态地处理它的存储需求。
主键的类型。
在类模板内部,使用其别名为 key_type 的成员类型。
T
被映射的值的类型。
在类模板内部,使用其别名为 mapped_type 的成员类型。
Hash
一元谓词,以一个 Key 类型的对象为参数,返回一个基于该对象的
size_t
类型的唯一值。
可以是函数指针(Function pointer)类型或函数对象(Function object)类型。
在类模板内部,使用其别名为 hasher 的成员类型。
Pred
二元谓词,以两个 Key 类型的对象为参数,返回一个 bool 值,如果第一个参数等价于第二个参数,该 bool 值为 true,否则为 false。默认为 std::equal_to。
可以是函数指针类型(Function pointer)类型或函数对象(Function object)类型。
在类模板内部,使用其别名为 key_equal 的成员类型。
Alloc
容器内部用来管理内存分配及释放的内存分配器的类型。
这个参数是可选的,它的默认值是 std::allocator<T>,这个是一个最简单的非值依赖的(Value-independent)内存分配器。在类模板内部,使用其别名为 allocator_type 的成员类型。
在 unordered_map 内部,元素不会按任何顺序排序,而是通过主键的 hash 值将元素分组放置到各个槽(Bucket,也可译成“桶”)中,这样就能通过主键快速地访问各个对应的元素(平均耗时为一个常量,即时间复杂度为 O(1))。
在访问容器中的某个元素时,unordered_map 容器比
map
容器高效,而在迭代容器元素的某个子集时,前者比后者稍微低效了一点。
unordered_map 实现了直接访问操作符(operator[]),使得可以通过主键(Key
value)直接访问被映射的值(Mapped value)。
unordered_map 容器支持正向迭代。
The unordered_map class supports forward iterators.
Iterators:
Capacity:
Element access:
Modifiers:
Observers:
Operations:
Buckets:
Hash policy:
Allocator:
头文件中包含大量与 unordered_map 容器相关的算法,常使用的有
C++11
// <unordered_map> template < class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, class Alloc = allocator< pair<const Key,T> > > class unordered_map;
无序映射表(Unordered Map)容器是一个存储以键值对组合而成的元素的关联容器(Associative container),容器中的元素无特别的次序关系。该容器允许基于主键地快速检索各个元素。
An unordered_map is an unordered associative container that supports unique keys (an unordered_map contains at most one of each key value) and that
associates values of another type mapped_type with the keys.
容器特性:
关联(Associative)
关联容器中的元素是通过主键(Key)而不是它们在容器中的绝对位置来引用的。
无序(Unordered)
无序容器通过 hash 表来组织它们的元素,允许通过主键快速地访问元素。
映射(Map)
每个元素为一个值(Mapped value)绑定一个键(Key):以主键来标志主要内容等于被映射值的元素。
键唯一(Unique keys)
容器中不存在两个元素有相同的主键。
能够感知内存分配器的(Allocator-aware)
容器使用一个内存分配器对象来动态地处理它的存储需求。
模板参数
Key主键的类型。
在类模板内部,使用其别名为 key_type 的成员类型。
T
被映射的值的类型。
在类模板内部,使用其别名为 mapped_type 的成员类型。
Hash
一元谓词,以一个 Key 类型的对象为参数,返回一个基于该对象的
size_t
类型的唯一值。
可以是函数指针(Function pointer)类型或函数对象(Function object)类型。
在类模板内部,使用其别名为 hasher 的成员类型。
Pred
二元谓词,以两个 Key 类型的对象为参数,返回一个 bool 值,如果第一个参数等价于第二个参数,该 bool 值为 true,否则为 false。默认为 std::equal_to。
可以是函数指针类型(Function pointer)类型或函数对象(Function object)类型。
在类模板内部,使用其别名为 key_equal 的成员类型。
Alloc
容器内部用来管理内存分配及释放的内存分配器的类型。
这个参数是可选的,它的默认值是 std::allocator<T>,这个是一个最简单的非值依赖的(Value-independent)内存分配器。在类模板内部,使用其别名为 allocator_type 的成员类型。
详细说明
在一个 unordered_map 容器中,主键通常被用来唯一标志(Uniquely identify)一个元素,而被映射的值保存了与该主键关联的内容。主键与被映射值的类型可以不同,在模板内部,这两种类型合并绑定成成员类型 value_type。由上述描述可知,value_type 是一个双元组类型(Pair type),具体定义如下:typedef pair<const Key, T> value_type;
在 unordered_map 内部,元素不会按任何顺序排序,而是通过主键的 hash 值将元素分组放置到各个槽(Bucket,也可译成“桶”)中,这样就能通过主键快速地访问各个对应的元素(平均耗时为一个常量,即时间复杂度为 O(1))。
在访问容器中的某个元素时,unordered_map 容器比
map
容器高效,而在迭代容器元素的某个子集时,前者比后者稍微低效了一点。
unordered_map 实现了直接访问操作符(operator[]),使得可以通过主键(Key
value)直接访问被映射的值(Mapped value)。
unordered_map 容器支持正向迭代。
The unordered_map class supports forward iterators.
成员类型
成员类型 | 定义 |
---|---|
key_type | 第一个模板参数 Key |
mapped_type | 第二个模板参数 T |
value_type | std::pair<const Key, T> |
size_type | 无符号整数类型(通常为 size_t) |
difference_type | 有符号整数类型(通常为 ptrdiff_t) |
hasher | 第三个模板参数 Hash |
key_equal | 第四个模板参数 KeyEqual |
allocator_type | 第五个模板参数 Alloc |
reference | value_type& |
const_reference | const value_type& |
pointer | std::allocator_traits<Allocator>::pointer |
const_pointer | std::allocator_traits<Allocator>::const_pointer |
iterator | 正向迭代器 |
const_iterator | 常正向迭代器 |
local_iterator | 本地迭代器,可以迭代一个槽的元素,但不能跨槽迭代 |
const_local_iterator | 常本地迭代器,可以迭代一个槽的元素,但不能跨槽迭代 |
成员函数
(constructor) | 创建 unordered_map |
(destructor) | 释放 unordered_map |
operator= | 值赋操作 |
begin | 返回指向容器起始位置的迭代器(iterator) |
end | 返回指向容器末尾位置的迭代器 |
cbegin | 返回指向容器起始位置的常迭代器(const_iterator) |
cend | 返回指向容器末尾位置的常迭代器 |
size | 返回有效元素个数 |
max_size | 返回 unordered_map 支持的最大元素个数 |
empty | 判断是否为空 |
operator[] | 访问元素 |
at | 访问元素 |
insert | 插入元素 |
erase | 删除元素 |
swap | 交换内容 |
clear | 清空内容 |
emplace | 构造及插入一个元素 |
emplace_hint | 按提示构造及插入一个元素 |
hash_function | 返回 hash 函数 |
key_eq | 返回主键等价性判断谓词 |
find | 通过给定主键查找元素 |
count | 返回匹配给定主键的元素的个数 |
equal_range | 返回值匹配给定搜索值的元素组成的范围 |
bucket_count | 返回槽(Bucket)数 |
max_bucket_count | 返回最大槽数 |
bucket_size | 返回槽大小 |
bucket | 返回元素所在槽的序号 |
load_factor | 返回载入因子,即一个元素槽(Bucket)的最大元素数 |
max_load_factor | 返回或设置最大载入因子 |
rehash | 设置槽数 |
reserve | 请求改变容器容量 |
get_allocator | 获得内存分配器 |
非成员函数
operator==、operator!=、operator<、operator<=、operator>、operator>= | 关系操作符 |
std::swap | 交换两个无序映射表容器的内容 |
算法相关
<algorithm>头文件中包含大量与 unordered_map 容器相关的算法,常使用的有
相关文章推荐
- AC+DP练习
- 运行hadoop程序遇到的一些问题及解决方案
- linux bash总结(二) 高级部分(适合初学者学习和非初学者参考)
- IOS7导航条与状态栏的那些事儿
- [转载]浅析Java中的final关键字
- 【数据库】E-R模型
- HDU 5015 233Matrix (构造矩阵)
- python 使用ioctl() 获得网卡IP 和MAC地址
- C# 抽象工厂
- 如何使Fiddler能捕获LoadRunner的http请求
- PHP开发提高效率技巧
- svn图标解释
- POJ2010--Moo University-Financial Aid(优先队列)
- 产品经理如何做好行业研究及竞争对手分析工作
- 更改点后输出把集合里的点通过树的边连在一起所需要的最小代价 LCA+树状数组 HDU 5296 Annoying problem
- SPOJ VLATTICE Visible Lattice Points (莫比乌斯反演基础题)
- 用 Apache 和 Subversion 搭建安全的版本控制环境
- SDUTOJ 3131 A回(完全背包)
- Mysql实现full join的替换方法
- java必看书籍