按关键字有序保存元素 | map | 关联数组:保存关键字-值对(键值对) |
set | 关键字即值,即只保存关键字的容器 | |
multimap | 关键字可重复出现的map | |
multiset | 关键字可重复出现的set | |
无序容器 | unordered_map | 用哈希函数组织的map |
unordered_set | 用哈希函数组织的set | |
unordered_multimap | 哈希组织的map,关键字可重复定义 | |
unordered_multiset | 哈希组织的set,关键字可重复出现 |
一、关联容器概述
1.支持方法
方法 | map | set | 作用 |
::at | √ | ||
:begin | √ | √ | |
:cbegin | √ | √ | |
::cend | √ | √ | |
::clear | √ | √ | |
::count | √ | √ | |
::crbegin | √ | √ | |
::crend | √ | √ | |
::emplace | √ | √ | |
::emplace_hint | √ | √ | |
::empty | √ | √ | |
::end | √ | √ | |
::equal_range | √ | √ | |
::erase | √ | √ | |
::find | √ | √ | |
get_allocator | √ | √ | |
::insert | √ | √ | |
::key_comp | √ | √ | |
lower_bound | √ | √ | |
max_size | √ | √ | |
::operator | √ | ||
::operator[] | √ | √ | |
::rbegin | √ | √ | |
::rend | √ | √ | |
::size | √ | √ | |
::swap | √ | √ | |
::upper_bound | √ | √ | |
::value_comp | √ | √ |
2.关联容器的初始化
//空容器
map<string, siez_t> stu_count;
//列表初始化
set<string> color = {"red", "blue", "black", "yellow"};
//用三个元素初始化map,必须键值对一一对应
map<string, uint32_t> authors = {{"Michael", 18},
{"Austen", 19},
{"Luna", 15}};
//初始化multimap 或 multiset
vector<int> ivec;
for (vector<int>::size_type i = 0; i != 10; ++i) {
ivec.push_back(i);
ivec.push_back(i); //每个数据重复保存一次
}
//iset包含来自ivec的不重复的元素;miset包含所有20个元素
set<ing> iset(ivec.cbegin(), ivec.cend());
multiset<int> miset(ivec,cbegin(), ivec.cend());
cout << ivec.size() << endl; //打印20
cout << iset.size() << endl; //打印10
cout << miset.size() << endl; //打印20
3.pair类型
3.1使用pair必须包含头文件#include <utility>,一个pair保存两个数据成员,类似容器,pair是一个用来生成特定类型的模板,当我们创建一个pair时,我们必须提供两个类型名,就像我们去银行都需要提供名字和身份证号一样
3.2pair的操作
pair<T1, T2> p; | p是一个pair,两个类型分别为T1,T2的成员都进行了值初始化 |
pair<T1, T2> p(v1, v2) | p是一个成员类型为T1和T2的pair,first和second成员分别用v1和v2进行初始化 |
pair<T1, T2>p = (v1, v2) | 等价于p(v1,v2) |
make_pair(v1, v2) | 返回一个用v1和v2初始化的pair,pair的类型从v1和v2的类型推导出来 |
p.first | 返回p的名为first的(公有)数据成员 |
p.second | 返回p的名为second的(公有)数据成员 |
p1 relop p2 | 关系运算符(<、>、<=、>=)按字典序定义 |
p1 == p2 | 当first和second成员分别相等时,两个pair相等。相等性判断利用元素的==运算符实现 |
p1 != p2 |
3.3例子:函数返回值为一个pair
pair<string,int> process(vector<string> &v)
{
if (!v.empty())
return {v.back(), v.back().size()}; //列表初始化
else
return pair<string, int>(); //隐式构造返回值:隐式构造一个空pair,并返回它
}
4.关联容器操作
key_type | 此容器类型的关键字类型 |
mapped_type | 每个关键字关联的类型:只适用于map |
value_type | 对于set,与key_type相同 对于map,为pair<const key_type, mapped_type> |
在set中,key_type和value_type是一样的,因为set保存的就是关键字
在map中,每一个元素是键-值对,即每个元素是一个pair对象,pair对象的key_type是const的,我们无法改变
5.关联容器迭代器
6.遍历关联容器
7.关联容器中添加元素
8.关联容器删除元素
9.元素的访问
10.无序容器的使用
桶接口 | 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.reserve(n) | 重组存储,使得c可以保存n个元素且不必rehash |
未完,待续。。。