您的位置:首页 > 其它

STL学习----入门(1)[unordered_map]

2015-08-24 18:23 211 查看
#include<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_typestd::pair<const Key,
T>
size_type无符号整数类型(通常为 size_t
difference_type有符号整数类型(通常为 ptrdiff_t
hasher第三个模板参数 Hash
key_equal第四个模板参数 KeyEqual
allocator_type第五个模板参数 Alloc
referencevalue_type&
const_referenceconst value_type&
pointerstd::allocator_traits<Allocator>::pointer
const_pointerstd::allocator_traits<Allocator>::const_pointer
iterator正向迭代器
const_iterator常正向迭代器
local_iterator本地迭代器,可以迭代一个槽的元素,但不能跨槽迭代
const_local_iterator常本地迭代器,可以迭代一个槽的元素,但不能跨槽迭代

成员函数

(constructor)创建 unordered_map
(destructor)释放 unordered_map
operator=值赋操作
​Iterators:

begin返回指向容器起始位置的迭代器(iterator
end返回指向容器末尾位置的迭代器
cbegin返回指向容器起始位置的常迭代器(const_iterator
cend返回指向容器末尾位置的常迭代器
Capacity:

size返回有效元素个数
max_size返回 unordered_map 支持的最大元素个数
empty判断是否为空
Element access:

operator[]访问元素
at访问元素
Modifiers:

insert插入元素
erase删除元素
swap交换内容
clear清空内容
emplace构造及插入一个元素
emplace_hint按提示构造及插入一个元素
Observers:

hash_function返回 hash 函数
key_eq返回主键等价性判断谓词
Operations:

find通过给定主键查找元素
count返回匹配给定主键的元素的个数
equal_range返回值匹配给定搜索值的元素组成的范围
Buckets:

bucket_count返回槽(Bucket)数
max_bucket_count返回最大槽数
bucket_size返回槽大小
bucket返回元素所在槽的序号
Hash policy:

load_factor返回载入因子,即一个元素槽(Bucket)的最大元素数
max_load_factor返回或设置最大载入因子
rehash设置槽数
reserve请求改变容器容量
Allocator:

get_allocator获得内存分配器

非成员函数

operator==、operator!=、operator<、operator<=、operator>、operator>=

关系操作符
std::swap交换两个无序映射表容器的内容

算法相关

<algorithm>
头文件中包含大量与 unordered_map 容器相关的算法,常使用的有

搜索算法std::adjacent_findstd::count

std::count_ifstd::find

std::find_ifstd::find_end

std::find_first_ofstd::search

std::search_nstd::equal

std::mismatch
二分查找(Binary search)std::lower_boundstd::upper_bound

std::equal_rangestd::binary_search
集合(Set)操作std::includesstd::set_difference

std::set_intersectionstd::set_union

std::set_symmetric_difference
最大与最小std::min_elementstd::max_element
字典序比较std::lexicographical_compare
排列生成器std::next_permutation

std::prev_permutation
其它操作std::all_ofstd::any_ofstd::none_of

std::for_eachstd::copystd::copy_if

std::copy_nstd::copy_backward

std::movestd::move_backward

std::swap_rangesstd::iter_swap

std::transformstd::replace

std::replace_ifstd::replace_copy

std::replace_copy_ifstd::fill

std::fill_nstd::generate

std::generate_nstd::remove

std::remove_ifstd::unique

std::unique_copystd::reverse

​std::reverse_copystd::rotate

std::rotate_copystd::random_shuffle

std::shufflestd::partition

std::is_partitionedstd::stable_partition

std::partition_copystd::merge

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: