关联容器额外的类型别名:
类型别名 | 解释 |
---|---|
key_type |
此容器类型的关键字类型 |
mapped_type |
关键字关联的类型,只适用于map |
value_type |
对于map ,是pair<const key_type, mapped_type> ; 对于 set ,和key_type 相同。 |
关联容器迭代器
auto / set<int>::iterator set_it = iset.begin();
++set_it(递增)/*set_it(解引用读值)/*map_it = val;(赋值 set只能访问)
- 解引用一个关联容器迭代器时,会得到一个类型为容器的
value_type
的值的引用。 set
的迭代器是const
的。- 遍历关联容器:使用
begin
和end
,遍历map
、multimap
、set
、multiset
时,迭代器按关键字升序遍历元素。
添加元素
关联容器insert
操作:
insert 操作 | 关联容器 |
---|---|
c.insert(v) c.emplace(args) |
v 是value_type 类型的对象;args 用来构造一个元素。函数返回一个pair ,包含一个迭代器,指向具有指定关键字的元素,以及一个指示插入是否成功的bool 值(可用于检测插入是否成功)。对于 map 和set ,只有元素的关键字不存在c 中才插入或构造元素。对于multimap 和multiset总是会插入成功的并返回一个指向插入元素的迭代器 |
c.insert(b,e) c.insert(il) |
b 和e 是迭代器,表示一个c::value_type 类型值的范围;il 是这种值的花括号列表。函数返回void 。对于 map 和set ,只插入关键字不在c 中的元素。对于multimap 和multiset总是会插入范围中的每一个值。 |
c.insert(p,v) c.emplace(p,args) |
类似insert(v) ,但将迭代器p 作为一个提示,指出从哪里开始搜索新元素应该存储的位置。返回一个迭代器,指向具有给定关键字的元素。 |
向map添加
元素的四种方法(因为map的元素类型是pair,要想插入的数据没有现成的pair需要在insert的参列中创建一个pair):
word_count.insert({word, 1});
word_count.insert(make_pair(word, 1));
word_count.insert(pair<string, size_t>(word, 1));
word_count.insert(map<string, size_t>::value_type (word, 1));
删除元素
从关联容器中删除元素:
操作 | 解释 |
---|---|
c.erase(k) |
从c 中删除每个关键字为k 的元素。返回一个size_type 值,指出删除的元素的数量。 |
c.erase(p) |
从c 中删除迭代器p 指定的元素。p 必须指向c 中一个真实元素,不能等于c.end() 。返回一个指向p 之后元素的迭代器,若p 指向c 中的尾元素,则返回c.end() |
c.erase(b, e) |
删除迭代器对b 和e 所表示范围中的元素。返回e 。 |
下标操作
map
和unordered_map
的下标操作:
操作 | 解释 |
---|---|
c[k] |
返回关键字为k 的元素;如果k 不在c 中,添加一个关键字为k 的元素,对其值初始化。 |
c.at(k) |
访问关键字为k 的元素,带参数检查;若k 不存在在c 中,抛出一个out_of_range 异常。 |
- 下标和
at
操作只适用于非const
的map
和unordered_map
。
查找元素
在一个关联容器中查找元素:
操作 | 解释 |
---|---|
c.find(k) |
返回一个迭代器,指向第一个关键字为k 的元素,若k 不在容器中,则返回尾后迭代器 |
c.count(k) |
返回关键字等于k 的元素的数量。对于不允许重复关键字的容器,返回值永远是0或1。 |
c.lower_bound(k) |
返回一个迭代器,指向第一个关键字不小于k 的元素。 |
c.upper_bound(k) |
返回一个迭代器,指向第一个关键字大于k 的元素。 |
c.equal_range(k) |
返回一个迭代器pair ,表示关键字等于k 的元素的范围。若k 不存在,pair 的两个成员均等于c.end() 。 |
lower_bound
和upper_bound
不适用于无序容器。
无序容器
- 有序容器使用比较运算符来组织元素;无序容器使用哈希函数hash<key_type>和 关键字类型的运算符==。
- 无序容器的性能依赖于哈希函数的质量和桶的大小和个数
- 无序容器在存储上组织为一组桶(bucket),每个桶保存零个或多个元素。无序容器使用一个哈希函数将元素映射到桶。(某些特定哈希值和具有相同关键字的元素放在一个桶中)
- 同一个桶保存多个元素时需要顺序搜索找到想要的那个, 计算一个元素的哈希值和在桶中搜索是很快的操作。
无序容器管理操作:
操作 | 解释 |
---|---|
桶接口 | |
c.bucket_count() |
正在使用的桶的数目 |
c.max_bucket_count() |
容器能容纳的最多的桶的数目 |
c.bucket_size(n) |
第n 个桶中有多少个元素 |
c.bucket(k) |
关键字为k 的元素在哪个桶中 |
桶迭代 | |
local_iterator |
可以用来访问桶中元素的迭代器类型 |
const_local_iterator |
桶迭代器的const 版本 |
c.begin(n) ,c.end(n) |
桶n 的首元素迭代器 |
c.cbegin(n) ,c.cend(n) |
与前两个函数类似,但返回const_local_iterator 。 |
哈希策略 | |
c.load_factor() |
每个桶的平均元素数量,返回float 值。 |
c.max_load_factor() |
c 试图维护的平均比桶大小,返回float 值。c 会在需要时添加新的桶,以使得load_factor<=max_load_factor |
c.rehash(n) |
重组存储,使得bucket_count>=n ,且bucket_count>size/max_load_factor |
c.reverse(n) |
重组存储,使得c 可以保存n 个元素且不必rehash 。 |
- 除了哈希管理操作之外,无序容器还提供了与有序容器相同的操作