目录
在之前我们已经学过了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的所有基本操作。
本期内容到此结束^_^