30 STL(八)set/multiset容器
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如上,就是自定义了个仿函数,其实也没什么可说的