C++笔记-set和map的使用
本章节讲解的map和set底层是红黑树,红黑树是一颗平衡二叉搜索树。set是key搜索场景的结构, map是key/value搜索场景的结构。
1.set系列的使用
1.1set的介绍
set就是我们上篇所实现的二叉搜索树的key搜索场景,它默认就是不存在重复数据的二叉搜索树,尔汗有重复数据的就是后面要讲的mutiset。
从上图可以看出,set的模板参数中含有三个不同的类型,第一个想必大家都知道,就是里面存储数据的类型。
第二个我们之前也讲过,就是仿函数,可以控制数据的输出顺序。
第三个是内存池,这部分知识我们还没有了解,这里就先跳过。
从以上图片可以看出,和我们之前所学的其它容器还是比较相似的,使用起来也非常相似:
这里可以看到set自动就对所传入的数据进行去重,并且按照升序排序的方式,而我们如果想让其输出的方式是从大到小,也可以利用仿函数:
并且我们是不能修改set中的值:
不能修改的原因呢我们上一篇已经讲过,会破坏二叉搜索树的结构,如果能修改那么二叉搜索树就失去了意义。
下面来讲解set中一些接口的使用方法。
1.2find
set中的find接口通过传入的值进行查找,如果找到了就返回相应的迭代器,也就是对应数据的位置,如果没有找到,就返回end()迭代器。
这里我们通过find接口来找5这个数据,结果显示找到了,说明此时返回的迭代器并不是end()。
而如果我们来找1这个数据,结果并没有找到,说明此时find返回的就是end()。
1.3erase
erase和我们之前所学容器的erase有些不一样,从上图对set的介绍可以看出,除了我们常见的void返回值以外,还有个size_type做返回值的。
而在set中这个size_type就是0或者1,删除成功返回1,删除失败就返回0,而这样设计的原因是为了和mutiset相照应。
可以看出此时的返回值时1,说明删除成功,我们通过再次打印出set中的数据也可以看到2已经被删除。
这里我们要删除1,发现删除失败,此时erase的返回值就为0。
1.4count
count接口就是来查找某个数据有几个,而在set中我们知道数据要么没有,要么只有一个,所以在set中count主要用来判断传入的数据在不在。
count的返回值依旧是1或者0,我们可以利用count的这个功能来写一种题型:
比如就像力扣上的这种题,我们就可以利用set来解决会更加的简单:
因为一个数组中蛊蛾可能会有重复的数据,所以利用set的去重特性以及count判断数据在不在,这道题写起来就极为简单。
