文章目录
一、引言
1、关联容器中的元素是按关键字来保存和访问的。关联容器支持高效的关键字查找和访问。
2、两个主要的关联容器类型是map和set。map中的元素是一些关键字–值对,关键字起到索引的作用,值表示与索引相关联的数据。set中的每个元素只包含一个关键字。
3、map和multimap定义在头文件中map中。
set和multiset定义在头文件set中。
4、map与multimap的区别:map的关键字不允许出现重复,multimap关键字可以重复出现,即使关键字相同,值不同。set与multiset与之相同。
5,、关联容器类型:
按关键字有序保存元素 | |
---|---|
map | 关联数组;保存关键字–值对 |
set | 关键字即值,只保存关键字的容器 |
multimap | 关键字可重复出现的map |
multiset | 关键字课重复出现的set |
无序集合 | |
---|---|
unordered_map | 用哈希函数组织的map |
unordered_set | 用哈希函数组织的set |
unordered_multimap | 哈希组织的,关键字可以重复 |
unordered_multiset | 哈希组织的,关键字可以重复 |
*无序与有序的区别:是否按顺序保存元素。(根据关键字排序)
二、关联容器概述
定义一个map时,必须指明关键字类型又指明值类型。定义set时,只需指明关键字类型。
1、定义关联容器(以map为例)
map<string,int>word_count //空容器
map<string,string> authors={ {"张","三"},{"王","五"}} //初始化
{key,value},关键字是第一个元素,值是第二个元素。定义时也是如此,map<key类型,value类型>。
2、关键字类型的要求
2.1、默认情况下,标准库使用关键字类型的<运算符来比较关键字。在集合类型中,关键字类型就是元素类型;在映射类型中,关键字类型是元素的第一部分的类型。
2.2、有序容器中定义的关键字类型,必须可以比较,如果没有,那必须自己写比较函数,使这种类型可以进行比较。
multiset<Sales_data,decltype(compareIsbn)*>bookstore;
compareIsbn是自己写的比较函数。
3、pair类型
3.1、pair定义在头文件utility中。
3.2、一个pair保存2个数据成员,类似容器它的数据成员是public,2个成员分别是first行业second。
3.3、
pair<T1,T2> p; | 默认初始化 |
pair<T1,T2> p{v1,v2}; | first用v1初始化,second用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==p2 | 当first和second分别相等时,两个pair相等 |
//未实现初始化
pair<string,string>anon;
pair<string,vector<int>>line;
//实现初始化
pair<string,string>anon1{"王","五"};
4、额外的类型别名
key_type | 此容器类型的关键字类型 |
mapped_type | 每个关键字关联的类型;只适用于map |
value_type | 对于set,与key_type相同,对于map,为pair<const key_type,mapped_type> |
map<string,int>::value_type v3; //v3是一个pair<const string,int>
map<string,int>::key_type v4; //v4是一个string
map<string,int>::mapped_type v5 //v5是一个int
5、关联容器的迭代器
map和set类型都支持begin和end操作。可以通过迭代器遍历容器。
auto map_it=word_count.begin();
while(map_it!=word_count.end())
{
cout<<map_it->second;
++map_it;
}
三、关联容器操作
只有当元素的关键字不在c中时才插入。
1、添加元素
c.insert(v) | 在c里面插入v |
c.insert(b,e) | b和e是迭代器,表示范围 |
c.insert(il) | il是元素列表 |
c.insert(p,v) | p是迭代器,表示在p处插入 |
c.emplace(args) | 用args替换c元素 |
c.emplace(p,args) | 替换p处的元素 |
insert返回pair类型,first指向具有给定关键字的元素,second是一个bool值,表示是否插入成功。
2、删除元素
c.erase(k) | 从c中删除每个关键字为k的元素,返回删除元素的数量 |
c.erase(v) | 从c中删除迭代器v指定的元素 |
c.erase(b,e) | 删除迭代器b和e所表示范围中的元素。返回e |
3、下标操作
3.1、set不支持下标操作。
3.2、使用一个不在容器中的关键字作为下标,会添加一个具有此关键字的元素到map中。
map<string,int> word_count;
word_count["张"]=1;
c[k] | 返回关键字为k的元素,若没有,则添加一个关键字为k的元素 |
c.at(k) | 访问关键字为k的元素,带参数检查,若没有则抛异常 |
下标操作的返回值是一个左值,跟数组操作一样。
4、访问元素
c.find(k) | 返回迭代器,指向第一个关键字为k的元素。若不在c中,返回尾后迭代器 |
c.count(k) | 返回关键字等于k的元素数目 |
c.lower_bound(k) | 返回一个迭代器,指向第一个关键字不下于k的元素 |
c.upper_bound(k) | 返回一个迭代器,指向第一个关键字大于k的元素 |
c.equal_range(k) | 返回迭代器pair,表示关键字等于k的元素范围 |