【STL】多重集合multiset和多重映射multimap

14天阅读挑战赛

前言

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

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

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

STL指南

多重集合

多重集合允许有重复元素,多重集合与集合用法差不多,只在几个成员函数上有细微差异,主要差异是去除了键必须唯一的限制

多重映射

多重映射允许一个键对应多个附加数据的映射,多重映射与映射用法差不多,只在几个成员函数上有细微差异,主要差异是去除了键必须唯一的限制

注意事项

多重关联容器一般较少使用find成员函数,而较多使用equal_range和count成员函数

扫描二维码关注公众号,回复: 14759384 查看本文章

由于一个键可能对应多个元素,因此使用find成员函数得到的迭代器所指向位置具有不确定性,一般只在确定一个键在容器中是否存在时才使用find成员函数

若要访问一个键所对应的每一个元素,可以使用equal_range成员函数。

若要得到一个键所对应元素的个数,可以使用count成员函数

映射所使用的[]在多重映射是不支持的,因为一个键不能对应一个唯一的元素

基本功能

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}};

注意事项

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

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

猜你喜欢

转载自blog.csdn.net/weixin_45720193/article/details/127603497
今日推荐