【STL】映射map

14 篇文章 0 订阅

14天阅读挑战赛

前言

由于本文涉及内容比较多,为了尽可能的讲详细些,会把各种例子附上,所以代码样例会比较多,也为了更好的布局,本系列将分开讲解,并且前期为了更加贴合实战需求,暂时只对一些常用的STL容器和基本功能进行讲解。

为了使每篇文章具有一定的独立性,后续的文章大多数会将之前文章涉及的知识点中提取,并且在后续会将相应的例子补上。

本文STL系列知识参考《C++语言程序涉及(第5版)》

STL指南

映射

映射元素类型是由键和附加数据所构成的二元组

特有函数

1. make_pair(v1,v2)

通过下的make_pair函数构造二元组,下面是该函数的函数模板

template<class T1,class T2>
pair<T1,T2>make_pair(T1 v1,T2 v2){
	return pair<T1,T2>(v1,v2);
}

2. erase(keyName)

这种通过键来删除元素的方式,是根据这个键找到这个元素,而通过迭代器删除元素的方式会更加高效,后者可以直接定位元素。

3. [ ]

map重载了[]运算符,可以通过[]插入新元素、修改或查询已有元素的附加数据

严格来说,s[k]所执行的操作是,再s中查询键为k的元素,若存在,则返回它的附加数据的引用,若不存在,则向s中插入一个新元素并返回该元素附加数据的引用,该附加数据的初值为V(),其中V是附加数据的类型。

若V是数值类型或指针类型,V()的值就是0

虽然[]运算符用起来方便,但却不能完全代替insert,find等函数,因为它会为新建自动创建新元素,因而无法判断容器中是否有具有指定键的元素。

基本功能

q1,q2表示不指向s元素的输入迭代器
S表示容器类型名
s表示S的实例
T表示S容器的元素类型
t表示T的实例
K表示S的键类型
k表示K的实例
n表示一个整数
p1,p2表示指向s的迭代器

构造函数

除了使用默认构造函数,也可以使用迭代器区间表示的序列进行构造

1.S s(q1,q2);

将[q1,q2)区间内的数据作为s的元素构造s

单重关联容器

当[q1,q2)范围内出席那相同键的元素时,只有第一个元素会被加入s

多重关联容器

[q1,q2)范围内的所有元素均被无条件加入s

插入元素

插入一个或多个元素
与顺序容器不同的时,无须通过迭代器指定插入位置

1.s.insert(t)

把t插入s中

单重关联容器

只有当不存在相同键的元素时才成功插入,返回pair<S::iterator,bool>
插入成功时,返回被插入元素的迭代器和true,
否则返回与t的键相同的元素的迭代器和false

多重关联容器

2.s.insert(p1,t)

将t插入s中,p1是一个提示的插入位置,如果提示准确(即t的键大小正好在p1前)则可以提高插入效率,及时提示不准确也可以正确完成插入,总是返回一个迭代器

单重关联容器

只有当不存在相同键的元素才可以成功插入

插入成功后,返回被插入元素的迭代器

否则返回与t的键相同的元素的迭代器

3.insert(q1,q2)

相当于按顺序对[q1,q2)区间的每个元素x分别执行s.insert(x)

元素删除

通过erase来删除,顺序容器提供的两种通过迭代器指定删除元素的调用形式对关联容器仍然有效,此外关联容器还允许通过键删除元素

1.s.erase(p1)

删除p1指向的元素

2.s.erase(p1,p2)

删除[p1,p2)区间的元素

3.s.erase(k)

删除所有键为k的元素,返回被删除元素个数

基于键的查找和计数

1.s.find(k)

找到任意一个键为k的元素,返回该元素的迭代器,如果s中没有键为k的元素,返回s.end()

2.s.lower_bound(k)

得到s中第一个键值不小于k的元素的迭代器

3.s.upper_bound(k)

得到s中第一个键值大于k的元素的迭代器

4.s.equal_range(k)

得到一个用pair<S::iterator,S::iterator>表示的区间,记为[p1,p2),该区间刚好包含所有键为k的元素,p1==s.lower_bound(k)和p2==s.upper_bound(k)一定成立。

5.s.count(k)

得到s容器中键为k的元素个数

关联容器的列表初始化

类似于顺序容器的列表初始化方式

对于一元关联容器直接提供元素列表即可

对于二元关联容器则需要通过{key,value}元素键值对的方式实现

set<int>integer_set={3,5,7};//以列表中int类型的元素为键创建一元集合对象
map<string,int>id_map={{"小明",1},{"李华",2}};

注意事项

关联容器的插入和删除不会使任何已有的迭代器、指针或引用失效

因此,在迭代器遍历容器过程中避免使用插入和删除操作,或者操作后需要停止遍历

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LenckCuak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值