美文网首页
30 STL(八)set/multiset容器

30 STL(八)set/multiset容器

作者: ca8519be679b | 来源:发表于2021-01-24 12:36 被阅读0次

    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

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

    相关文章

      网友评论

          本文标题:30 STL(八)set/multiset容器

          本文链接:https://www.haomeiwen.com/subject/yvjlzktx.html