C++关联容器

一、pair类型

在介绍关联容器之前,我们需要了解名为pair的标准库类型,它定义在头文utility中。
下表为pair的操作

pair<T1,T2>    p1;                     创建一个空的pair对象,它的两个元素分别是T1和T2类型,采用值初始化
pair<T1,T2>    p1(v1,v2);              创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v2,second成员初始化为v2。
make_pair(v1,v2)                       以v1,v2值创建一个新的pair对象,其元素类型分别是v1,v2类型
p1<p2                                  两个pair对象之间的小于运算,遵循字典顺序
p1==p2                                 如果两个pair对象的first和second值依次相等,则它们相等
p.first                                返回p中名为first的数据成员
p.second                               返回p中名为second的数据成员

一个pair 保存两个数据成员,它们都是public的,分别命名为first,second。可以看出pair是生成特定类型的模板。

二、关联容器的类别

标准库提供了8个关联容器

按关键字有序保存元素
map										关联数组;保存(关键字-值)对
set										关键字即值
multimap								关键字可重复出现的map
multiset								关键字可重复出现的set
无序集合
unordered_map							用哈希函数组织的map
unordered_set							用哈希函数组织的set
unordered_multimap						哈希组织的map,关键字可重复
unordered_multiset						哈希组织的set,关键字可重复

在本文中只讲set和map,其他类型的使用都可以类比。

三、map类型

map是一个排序的关联容器,它包含具有惟一键的键值对。通过使用Compare函数对键进行排序。搜索、删除和插入操作具有对数复杂度。映射通常被实现为红黑树。map定义在头文件map中。

1.定义map

map共有3种构造函数用于定义和初始化。

map<k,v>    m;                 创建一个名为m的空map对象,其键和值类型分别为k和v类型
map<k,v>    m(m2);             创建一个m2的副本m,m和m2必须要有相同的键和值类型
map<k,v>    m(b,e);            创建map类型的对象m,存储迭代器b和e标记范围内所有元素的副本。
							   元素的类型必须能转换位pair<const k,v>		
2.map额外的类型别名
map<k,v>::key_type	v1						v1的类型是k
map<k,v>::mapped_type	v2					v2的类型是v
map<k,v>::value_type	v3					v3的类型是pair<const k,v>
3.向map中添加元素

给map添加元素有两种方式:一是使用insert操作实现。二是先用下标获取元素,让然后给获取的元素赋值。
 首先,介绍使用insert操作向map中添加元素
 先定义一个map,用来具体地说明如何向map中添加元素

#include<map>
map<string,int> word_count;

在对一个map进行insert操作前,必须记住元素类型是pair。现在向word_count中添加元素。

word_count.insert({word,1});
word_count.insert(make_pair(word,1));
word_count.insert(pair<string,int>(word,1));
word_count.insert(map<string,int>::value_type(word,1));

这是向word_count中添加元素的4种方法,可以看出创建一个pair最简单的方法是在参数列表中使用{}初始化。

map<k,v> m;
m.insert(e);				e是map<k,v>::value_type类型的对象
m.insert(beg,end);			beg和end是迭代器,它们的值的类型是map<k,v>::value_type。
							这个操作会向m中添加在beg和end之间范围的元素,
m.insert(iter,e)			e是一个用在vaule_type类型的值。
							如果键不在m中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置。

第二种用下标获取元素,让然后给获取的元素赋值。

map<string,int> word_count;
word_count["student"]=1

可以看出,map使用下标与数组类似,但是map的下标是键,不一定是数组下标中的数字。

4.删除map中的元素

从map容器中删除元素用erase操作,它有三个版本,如下:

m.erase(k);				从m中删除每个关键字为k的元素
						返回一个size_tyep值,指出删除元素的数量。
m.erase(iter);			iter是一个迭代器,从m中删除iter指向的元素。
						iter必须指向m中一个真实的元素,不能等于m.end()。
						返回一个指向iter之后元素的迭代器,若iter指向m中的尾元素。则返回m.end()。
m.erase(beg,end);		删除迭代器对beg和end所表示的范围中的元素。返回e。
5.访问map中的元素

map中下标读取元素的缺点是当不存在该元素时会自动添加,有时这是我们不希望看到的。所以map提供了另外两个操作:count和find,用于检查某个键是否存在而不会插入该键。

m.count(k)               返回m中k出现次数
m.find(k)                如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器
6.访问map中的元素
map<string,int>::const_iterator   map_it=word_count.begin();

while(map_it!=word_count.end()){
    cout<<map_it->first<<"occurs"
            <<map_it->second<<"time"<<endl;
     ++map_it;
}

四、set类型

set只是单纯的键的集合。当只想知道一个值是否存在时,使用set容器是最合适的。set容器支持大多数map的操作,包括构造函数、insert、count、find、erase操作。但是不包括下标操作,没有定义mapped_type类型。在set容器中value_type不是pair类型,而是与key_type相同的类型。与map一样,set容器中存储的键也是唯一的。

1.set的定义
set<string> word = {"I","love","u"};
2.向set中添加元素

set<string>  set;
//方法一,直接插入
set1.insert("the");    

//方法二,使用迭代器
set.insert(v.begin(),v.end());
3.访问set中的元素

set没有下标操作,为了通过键从set中获取元素,可使用find运算。如果仅是判断某个元素是否存在,也可使用count操作,返回值只能是1或0。

参考《C++ Primer第五版中文版》

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值