原文链接:https://blog.csdn.net/sodacoco/article/details/84798621

c++语言中,multiset是<set>库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数是有序的,而且序列中可以存在重复的数。

简单应用:

通过一个程序来看如何使用multiset:

    1. #include <string>
      1. #include <iostream>
        1. #include <set>
          1. using namespace std;
            1. void main(){
              1.     intx;
                1.     scanf("%ld",&x);
                  1.     multiset<int>h; //建立一个multiset类型,变量名是h,h序列里面存的是int类型,初始h为空
                    1.     while(x!=0){
                      1.         h.insert(x); //将x插入h中
                        1.         scanf("%ld",&x);
                          1.     }    
                            1.     while(!h.empty()){ // 序列非空 h.empty()==true时 表示h已经空了
                              1.         __typeof(h.begin()) c=h.begin();
                                1. //c指向h序列中第一个元素的地址,第一个元素是最小的元素
                                  1.         printf("%ld ",*c); //将地址c存的数据输出
                                    1.         h.erase(c); //从h序列中将c指向的元素删除
                                      1.     }
                                        1. }
                                      1.  

                                      对于输入数据:32 61 12 2 12 0,该程序的输出是:2 12 12 32 61。

                                      放入自定义类型的数据:

                                      不只是int类型,multiset还可以存储其他的类型诸如 string类型,结构(struct或class)类型。而我们一般在编程当中遇到的问题经常用到自定义的类型,即struct或class。例如下面的例子:

                                        1. struct rec{
                                          1.     int x,y;
                                            1. };
                                              1. multiset<rec>h;
                                            1.  

                                            不过以上的代码是没有任何用处的,因为multiset并不知道如何去比较一个自定义的类型。怎么办呢?我们可以定义multiset里面rec类型变量之间的小于关系的含义(这里以x为第一关键字为例),具体过程如下:

                                            定义一个比较类cmp,cmp内部的operator函数的作用是比较rec类型a和b的大小(以x为第一关键字,y为第二关键字):

                                              1. struct cmp{
                                                1.     bool operator()(const rec&a,const rec&b){
                                                  1.         return a.x<b.x||a.x==b.x&&a.y<b.y;
                                                    1.     }
                                                      1. };
                                                    1.  

                                                    然后将语句"multiset<rec>h ;”改成"multiset<rec,cmp>h;"这样以后,我们就告诉了序列h如何去比较里面的元素(重载运算符)

                                                    此时rec以及multiset的定义部分完整代码可参考如下:

                                                      1. struct rec{
                                                        1.     int x,y;
                                                          1. };
                                                            1. struct cmp{
                                                              1.     bool operator()(const rec&a,const rec&b){
                                                                1.         return a.x<b.x||a.x==b.x&&a.y<b.y;
                                                                  1.     }
                                                                    1. };
                                                                      1. multiset<rec,cmp>h;
                                                                    1.  

                                                                    通过以上代码,能够建立一个集合h使得该集合能够存储和排序自定义类型

                                                                    常用函数总结:

                                                                    构造、拷贝、析构

                                                                    操作

                                                                    效果

                                                                    set c

                                                                    产生一个空的set/multiset,不含任何元素

                                                                    set c(op)

                                                                    以op为排序准则,产生一个空的set/multiset

                                                                    set c1(c2)

                                                                    产生某个set/multiset的副本,所有元素都被拷贝

                                                                    set c(beg,end)

                                                                    以区间[beg,end)内的所有元素产生一个set/multiset

                                                                    set c(beg,end, op)

                                                                    以op为排序准则,区间[beg,end)内的元素产生一个set/multiset

                                                                    c.~set()

                                                                    销毁所有元素,释放内存

                                                                    set<Elem>

                                                                    产生一个set,以(operator <)为排序准则

                                                                    set<Elem,0p>

                                                                    产生一个set,以op为排序准则

                                                                    非变动性操作

                                                                    操作

                                                                    效果

                                                                    c.size()

                                                                    返回当前的元素数量

                                                                    c.empty ()

                                                                    判断大小是否为零,等同于0 == size(),效率更高

                                                                    c.max_size()

                                                                    返回能容纳的元素最大数量

                                                                    c1 == c2

                                                                    判断c1是否等于c2

                                                                    c1 != c2

                                                                    判断c1是否不等于c2(等同于!(c1==c2))

                                                                    c1 < c2

                                                                    判断c1是否小于c2

                                                                    c1 > c2

                                                                    判断c1是否大于c2

                                                                    c1 <= c2

                                                                    判断c1是否小于等于c2(等同于!(c2<c1))

                                                                    c1 >= c2

                                                                    判断c1是否大于等于c2 (等同于!(c1<c2))

                                                                    特殊的搜寻函数

                                                                      sets和multisets在元素快速搜寻方面做了优化设计,提供了特殊的搜寻函数,所以应优先使用这些搜寻函数,可获得对数复杂度,而非STL的线性复杂度。比如在1000个元素搜寻,对数复杂度平均十次,而线性复杂度平均需要500次。

                                                                    操作

                                                                    效果

                                                                    count (elem)

                                                                    返回元素值为elem的个数

                                                                    find(elem)

                                                                    返回元素值为elem的第一个元素,如果没有返回end()

                                                                    lower _bound(elem)

                                                                    返回元素值为elem的第一个可安插位置,也就是元素值 >= elem的第一个元素位置

                                                                    upper _bound (elem)

                                                                    返回元素值为elem的最后一个可安插位置,也就是元素值 > elem 的第一个元素位置

                                                                    equal_range (elem)

                                                                    返回elem可安插的第一个位置和最后一个位置,也就是元素值==elem的区间

                                                                    赋值

                                                                    操作

                                                                    效果

                                                                    c1 = c2

                                                                    将c2的元素全部给c1

                                                                    c1.swap(c2)

                                                                    将c1和c2 的元素互换

                                                                    swap(c1,c2)

                                                                    同上,全局函数

                                                                    迭代器相关函数

                                                                      sets和multisets的迭代器是双向迭代器,对迭代器操作而言,所有的元素都被视为常数,可以确保你不会人为改变元素值,从而打乱既定顺序,所以无法调用变动性算法,如remove()。

                                                                    操作

                                                                    效果

                                                                    c.begin()

                                                                    返回一个随机存取迭代器,指向第一个元素

                                                                    c.end()

                                                                    返回一个随机存取迭代器,指向最后一个元素的下一个位置

                                                                    c.rbegin()

                                                                    返回一个逆向迭代器,指向逆向迭代的第一个元素

                                                                    c.rend()

                                                                    返回一个逆向迭代器,指向逆向迭代的最后一个元素的下一个位置

                                                                    安插和删除元素

                                                                      必须保证参数有效,迭代器必须指向有效位置,序列起点不能位于终点之后,不能从空容器删除元素。

                                                                    操作

                                                                    效果

                                                                    c.insert(elem)

                                                                    插入一个elem副本,返回新元素位置,无论插入成功与否。

                                                                    c.insert(pos, elem)

                                                                    安插一个elem元素副本,返回新元素位置,pos为收索起点,提升插入速度。

                                                                    c.insert(beg,end)

                                                                    将区间[beg,end)所有的元素安插到c,无返回值。

                                                                    c.erase(elem)

                                                                    删除与elem相等的所有元素,返回被移除的元素个数。

                                                                    c.erase(pos)

                                                                    移除迭代器pos所指位置元素,无返回值。

                                                                    c.erase(beg,end)

                                                                    移除区间[beg,end)所有元素,无返回值。

                                                                    c.clear()

                                                                    移除所有元素,将容器清空

                                                                    mutiset的简单介绍转载的更多相关文章

                                                                    1. VPN理论简单介绍(转载)

                                                                      标签:VPN理论简单介绍 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lvnian.blog.51cto.com/715528 ...

                                                                    2. Kubernetes1-K8s的简单介绍(转载)

                                                                      一.简介 1.什么是Kubernetes 简称K8s,用8代替8个字符"ubernerte"而成的速写,K8s是一个开源的容器编排平台,它是一个跨主机集群的开源容器调度平台,用于管 ...

                                                                    3. iOS多线程编程之多线程简单介绍(转载)

                                                                      一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“ ...

                                                                    4. IOS-UIProgressView的简单介绍

                                                                      IOS-UIProgressView的简单介绍 转载:http://blog.sina.com.cn/s/blog_9c2363ad0101e1jy.html // UIProgressView的使用 ...

                                                                    5. Asp.net博客系统收集和简单介绍

                                                                      国内Asp.net博客系统收集和简单介绍       [转载文章,仅供个人参考,引自http://www.soyaoo.com/Blog/post/92.html] 1.ZJ-Blog程序简介:基于A ...

                                                                    6. 【转载】JMeter学习(一)工具简单介绍

                                                                      JMeter学习(一)工具简单介绍 一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静 ...

                                                                    7. 转载 mvc:message-converters简单介绍 https://www.cnblogs.com/liaojie970/p/7736098.html

                                                                      mvc:message-converters简单介绍 说说@ResponseBody注解,很明显这个注解就是将方法的返回值作为reponse的body部分.我们进一步分析下这个过程涉及到的内容,首先就 ...

                                                                    8. IPv4和IPv6简单对比介绍(转载)

                                                                      原链接:https://baijiahao.baidu.com/s?id=1570208896149974&wfr=spider&for=pc 在配置计算机网络,特别是内网的时候,有时 ...

                                                                    9. 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)

                                                                      salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)   salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...

                                                                    随机推荐

                                                                    1. eclipse 查看项目svn路径

                                                                      1. window -- show view -- other -- svn -- svn资源库 2. 右键 -- properties 3.复制路径,打开TortoiseSvn -- Repo br ...

                                                                    2. mpvue路由传参报错Cannot read property 'query' of undefined

                                                                      在mpvue编写的小程序项目中,页面跳转间我希望通过编程式导航传递些参数 传参页面代码: this.$router.push({path:'/pages/login/changePassword/ma ...

                                                                    3. Maven与Nexus

                                                                      开始在使用Maven时,总是会听到nexus这个词,一会儿maven,一会儿nexus,当时很是困惑,nexus是什么呢,为什么它总是和maven一起被提到呢? 我们一步一步来了解吧. 一.了解Mav ...

                                                                    4. java课极限测试

                                                                      在临近国庆的9月30号补课日 碰到了惨绝人寰的java课极限测试 我从下午两点半做到晚上九点 不得不说人在烦躁的时候是真的没办法写代码的 根本不想思考也不想学习.最后的几个小时基本就是在叹息和坐着.也 ...

                                                                    5. HDU 4699 Editor(模拟 对顶栈)

                                                                      题目大意: 给定一个整数序列 维护5种操作 次数<1e6 I x: 光标位置插入x 然后光标位于x之后 D: 删除光标前一个数 L: 光标左移 R: 光标右移 Q k: 询问位置k之前的最大前缀 ...

                                                                    6. 【转】获取Jenkins构建时Git Change Log

                                                                      原文:https://www.jianshu.com/p/513ab6915dbd 在基于Jenkins进行CI持续集成的工作,在构建后上传蒲公英时想将本次版本的git commit信息同步到蒲公英的 ...

                                                                    7. 深度学习之父低调开源 CapsNet,欲取代 CNN

                                                                      “卷积神经网络(CNN)的时代已经过去了!” ——Geoffrey Hinton 酝酿许久,深度学习之父Geoffrey Hinton在10月份发表了备受瞩目的Capsule Networks(Cap ...

                                                                    8. 安装scikit-learn

                                                                      首先到官网下载安装 python ,之后下载setuptools 进行安装. 'python' 不是内部或外部命令  可运行 set PATH=%PATH%;C:\Python34 安装完成之后,运行 ...

                                                                    9. 前端学习 之 CSS(一)

                                                                      一:什么是 CSS? ·CSS 指层叠样式表 (Cascading Style Sheets) ·样式定义如何显示 HTML 元素 ·样式通常存储在样式表中 ·把样式添加到 HTML 4.0 中,是为 ...

                                                                    10. Python开发:Python运算符

                                                                      运算符 1.算数运算: 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 - 两个数相乘或是返 ...