C++之map和set的基本操作

目录

set的基本操作

元素的插入

元素的遍历

元素的查找 

元素的删除

multiset的基本操作 

count接口

 元素的查找

元素的删除 

map的基本操作

元素的插入

 元素的遍历

元素的查找

元素的删除 

operator[ ]接口 

multimap的基本操作


在之前我们已经学过了vector,list,string和deque这些序列式容器,这些序列式的容器,本期我们要学习的是C++中的关联式容器,map和set。

set的基本操作

在上期我们学习了搜索二叉树,其实搜索二叉树有两种类型,分别是key模型可key_value模型。key模型判断的是在不在,key_value模型是在判断在不在的同时,还储存了其它的信息。

set其实就是搜索二叉树中的key模型。

元素的插入

代码和运行截图如下。

set的插入我们浅浅学习,在学习map时我们会深入讲解。 

元素的遍历

set是一个双向迭代器,支持++和--操作。

在插入元素之后我们用迭代器访问set的元素,我们插入了两个4但是最终在便利的时候发现只有一个四,且输出的元素的大小是按升序排列,也就意味着set的作用其实也就是排序加去重,迭代器本质的遍历也是二叉树的中序遍历。 

元素的查找 

find函数的返回值为一个迭代器类型,如果找到了当前的key值就返回当前key值所对应的节点的迭代器,如果找不到就返回end()。

 

元素的删除

set的删除可以传迭代器,可以传key值,也可以传迭代器区间进行删除。注意:在使用key值进行删除时,返回值为删除的key值的个数这个在set中其实并没有多大的用处,但是在multiset中有重大用处。 

multiset的基本操作 

multiset的基本操作和map类似,multiset和set的唯一区别就是multiset是不去重+排序,set是去重+排序。

count接口

在set中也有这个接口,用于统计set容器中某一元素的个数,但是在set中无非就是0或者1,所以我们不去关注此接口,但是在multiset中此接口大有用处。

 元素的查找

如果在multiset中查找元素,返回的也是迭代器,可是像上图中如果我们插入了三个4,那么返回的是哪一个4的迭代器呢?我们通过代码作为验证。 

通过代码和运行结果不难发现,最终打印了3个4,所以不难看出,find接口查找的key值,其实就是就是对应的key值在中序遍历中率先遍历的key值。 

元素的删除 

与set类似,但是因为mutiset允许相同的元素存在,所以在删除的时候尽量选取值删除而不是迭代器删除。

map的基本操作

map本质上就是搜索二叉树中的key_value模型。

元素的插入

 我们发现插入的元素的类型是value_type类型,value_type类型在文档中也有介绍。

 pair本质就是一个键值对,也是一个类,里面有两个成员,第一个成员为first,第二个成员为second,first即为key,second即为value。

我们可以直接创建一个pair对象进行插入,也可以通过make_pair函数创建pair对象。

 3个插入函数我们一般使用第一个insert函数,但是这个insert函数的返回值是一个pair类型的对象,这是什么意思呢?


我们知道map的作用其实也是排序+去重,所以当我们在插入元素时,相同的元素只允许插入一次,所以当我们在插入元素时,如果插入的元素在map中已经存在,所以就会插入不成功。返回值pair的第二个参数为bool类型,用于判断插入是否成功,第一个参数为迭代器类型,如果插入成功,则返回新插入的元素所在的节点的迭代器,如果插入失败,意味着当前的元素map中已经存在,则返回已经存在的元素所在的节点的迭代器。

这在后续理解[ ]的使用时,有重要意义。

 元素的遍历

map的迭代器也是一个双向迭代器。

元素的遍历我们可以使用迭代器进行遍历,也可以使用范围for进行遍历,但是范围for的本质就是迭代器。

元素的查找

与set类似。

元素的删除 

一般使用第二个删除接口,直接按照key值进行删除。

operator[ ]接口 

这个接口是用来干什么的呢?

有这样一个场景,公司一般会给员工在休闲时间送果盘,但是公司为了进一步提升员工对公司的满意度,想做这样一个调查,想统计每种水果果盘的使用数量,最终根据数量,合理的调整每种果盘的供给数量。代码和结果如下。

用上述代码确实可以统计出来各种水果的数量,但是这种方法太过麻烦,此时operator[ ]这个接口,就发挥了重要的作用。

我们先来看看这个接口的实现。

这个接口的返回值是什么,是pair对象的value的引用。上述用红色方框圈出来的就是函数的返回值,这个返回值怎么理解呢?

可以理解为,先往map中插入了对应的pair对象(key值就是我们要插入的key值,但是value的值我们给了匿名对象的值即空值),插入的结果成功与否我们可以通过insert的返回值pair对象的第二个参数获知,但是此时我们根本就不考虑插入是否成功,我们只需要插入之后的返回值pair对象的第一个参数,即迭代器,插入成功就是当前新插入的元素的对应节点的迭代器,插入失败意味着当前元素已经存在,所以返回已经存在的元素对应的节点的迭代器。然后解引用迭代器,返回对应的节点的pair对象的value的引用。

 通过上述知识点,我们可以对上述场景的代码做改进。

通过这种方式,我们也实现了各种水果的数量的统计。 

multimap的基本操作

multimap的基本操作和map类似。我们不再介绍,但是需要注意的是multimap中并不支持operator[]操作。

multimap的功能和muitiset类似,都是不去重+排序,这就意味着可以插入多个相同的key值,所以multimap的插入永远是成功的。此时的operator[ ]接口的返回值永远就是新插入的元素对应节点的pair对象的value对象,所以此时operator[ ]接口的存在就没有太大的存在意义。 

所以在multimap中并不支持operator[ ]接口。

以上便是map和set的所有基本操作。

本期内容到此结束^_^ 

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

棠~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值