C++ Primer学习笔记(第十章)-关联容器

关联容器

关联容器是通过键值来读取数据,即是key-value类型,这也是其与顺序容器(顺序容器通过位置顺序来读取数据)最大的区别。
在STL中提供了以下几种关联容器:

容器名称说明
map关联数组,元素通过键值进行存储和读取
set大小可变的集合,可以通过键值实现数据的快速读取
multimap支持同一个键值多次出现的map
multiset支持同一个键值多次出现的set

注:map是key-value数组(关联数组);set是key集合,仅仅存储了键值。


引言

在介绍关联容器之前,先介绍一个可以实现数据简单组合的结构:pair

常见的功能说明
pair< type1, type2> p1默认构造函数,创建一个pair
pair< type1, type2> p1(v1, v2)带初始化的构造函数,创建一个pair并进行初始化
make_pair(v1, v2)将v1和v2进行组合,返回值为pair
p.first / p.second返回pair的第一个位置的数据/返回第二个位置的数据
p1 < p2return(p1.first < p2.first && p1.second < p2.second)
p2 == p2return(p1.first == p2.first && p1.second == p2.second)

1.map和multimap

1.1 map类型

map是key-value类型的数据结构,其不仅要存储键值key,还要存储数值value,而且map类型的数据是根据key查找value。
map具有三种数据类型,分别为:
- map< T1,T2>::value_type : pair类型,包括key_type和mappend_type
- map< T1, T2>::key_type :键值的类型
- map< T1, T2>::mappend_type:数据的类型

1)构建新的map

map具有三种不同的构造方式,可以通过没有参数的默认构造方法构造一个map,也可以通过赋初值的方式构造一个map。

常见的操作说明
map< k, v> m默认构造函数,创建一个空map
map< k, v> m(m2)通过另一个map数据m2来构造新的对象
map< k, v> m(b, e)通过一个map数组,即b=m2.begin(),e=m2.end()来构造一个新的map数组

2)元素的基本操作

map对元素具有添、删除等多种操作方式,下面简要的介绍map的插入和删除操作:

插入说明
insert(e)插入元素e(e的类型为pair),如果没有元素e就插入元素,并返回pair< map< T1, T2>, bool>,其中可以正常插入bool值为true以及插入元素的位置(迭代器),如果插入失败就发挥false;有个已经存在元素e就什么也不错。
insert(b,e)插入begin()~end()之间的数据,返回void
insert(iter,e)插入元素e,如果没有元素e就插入元素,并返回e的迭代器位置iter;否则什么也不做
map[key]=value通过这种下标的方式插入,如果没有元素< key, value>就直接插入数据,否则什么也不做

注:通过下标的方式不仅可以读取到元素,同时还可以插入元素,因此,在使用的时候,要注意特别的小心!!!

删除说明
erase(k)删除键值为k的元素,返回值类型为size_type,表示删除的元素个数
erase(p)删除元素p,p的类型为pair,返回值为void
erase(b,e)删除从begin()到end()之间的元素,返回值为void

对于map类型的数据可以通过下标的方式进行查找,同时也可以通过find函数进行查找,不过通过下标的方式会自动的添加没有的元素到map中。

其他函数说明
find(k)查找键值k,如果存在就返回k的迭代器,否则就返回end();对于multimap而言,返回的是查找到的第一个元素的位置
count(k)统计键值为k的元素的个数(map的返回值为0或者1,因此可以作为查找使用)
begin()map类型的起始位置(通常是最小的元素–小根堆)
end()map类型的结束为止

注:map类型的迭代器支持自加(++)自减(–)运算

1.2 multimap类型

multmap和map的最大的区别就是:map类型的键值key只能对应一个数据,而multimap类型的键值key可以对应多个数值(map是一对一的关系,multimap是一对多的关系)
注1:multimap和map支持的操作相同(除了下标操作
住2:multimap和map中的元素都是按顺序排放的,因此,multimap中相同的元素是相邻存储的

1.3其他函数

函数说明
lower_bound(k)返回一个iterator,指向第一个不小于(>=)k的第一个元素
upper_bound(k)返回一个iterator,指向第一个大于(>)k的第一个元素
equal_bound(k)返回一个 pair类型数据,其first元素满足lower_bound(k)的迭代器,second元素满足upper_bound(k)的迭代器

注1:利用lower_bound和upper_bound可以实现查找功能,利用这两个函数可以确定元素k的范围
住2:利用equal_bound也可以实现查找功能,而且是上述两个函数的总体功能


2.set和multiset

set类型是key的集合,因此,set类型中没有下标操作,同时不支持mapped_type,value_type与key_type是同类型的,而不是像map中的pair类型。
set支持的操作与map是一样的,包括函数的参数以及实用方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值