30 STL(八)set/multiset容器

2021-01-24  本文已影响0人  ca8519be679b

P基本概念

set插入时会被自动排序,底层结构是二叉树实现。区别是set不允许有重复元素,而mulitset允许

两者共用一个头文件<set>

构造和赋值

1

构造一个是默认构造,一个是拷贝构造,赋值是=重载的操作符,set没有push类方法只有insert(val)方法,而且自动排序,无pos可言

2

如上,我们使用set给插入降序,结果出来却是升序的,注意迭代器还可以使用begin,end获取,但是不能使用<,为了好记,一般迭代器都建议使用!=

set容器是去重的,我们可以插入重复的值,但是只有一个

大小和交换

3

如上,方法很简单,不允许重新指定大小

4

插入和删除

5

如上,插入和删除只有insert和erase,clear实现清空

6

如上,我们实现了各种方法,当然set也有erase删除所有重复元素的方法,当然对于set就是删除对应元素,对于multiset就是删除所有元素

查找和统计

7

如上,查找find返回迭代器指针,count对于set来说就是0,1,如果是multiset可以用于统计重复元素的个数

8

如上,代码是没什么说的

set和multiset区别

9

我们之前使用insert给set插入数据,其实是有返回值的,如上,我们可以看到内容,返回的是_Pairib对象

10

而其我们查看定义其实是个pair对象,由迭代器和bool值来返回,其中bool值用于返回是否插入成功

11

如上,我们使用pair类型去接收,其可以使用second属性(不是方法)获得到bool值,当然我们也可以用int接收,可以看到结果是第一次可以insert成功,第二次就不可以了、

12

当然multiset就不用了,因为其只返回迭代器对象,所以不用判断是否成功,重复也可以往里插

pair对组

上节课我们使用set的insert方法返回的是pair对组

13

这次我们好好研究下,其创建方法如上2种,注意格式,pair对象,指定模板的2个对象类型,变量名然后小括号里面给初始值,另一种是使用make_pair方法传入2个值给pair对象初始化,我们可以使用p对象的first,second属性来获得这2个属性对象

14

如上,方法调用没什么说的,相当于python的二元组

set容器排序

我们知道set默认的排序是升序的,如果我们想修改其为降序存储,就需要使用仿函数

15

如上,我们先正常输出,其实升序的;

16

如上,其实现是使用构造的重载,指定默认的排序器,这里排序器我们使用了仿函数,本质就是重载了()方法的类,可以将类实现调用当函数使用,(类似python实现__call__),别的就没什么说的了

17

仿函数有什么作用呢,如果我们insert自定义类型,set就不会识别该按什么排序了,就需要我们使用自定义仿函数规则

18

如上,就是自定义了个仿函数,其实也没什么可说的

上一篇下一篇

猜你喜欢

热点阅读