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

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

简单应用:

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


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

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

放入自定义类型的数据:

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


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

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

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


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

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

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


  1. struct rec{
  2.     int x,y;
  3. };
  4. struct cmp{
  5.     bool operator()(const rec&a,const rec&b){
  6.         return a.x<b.x||a.x==b.x&&a.y<b.y;
  7.     }
  8. };
  9. multiset<rec,cmp>h;

通过以上代码,能够建立一个集合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. hash路由

    class HashRouter{ constructor(){ //用于存储不同hash值对应的回调函数 this.routers = {}; window.addEventListener('ha ...

  2. WLC RTU license

    目前思科的某些WLC不是一定要license文件去安装,例如这里提到的RTU license. RTU:Right To Use Right to Use (RTU) licensing is a m ...

  3. 【SSM】Log4j 日志配置

    1.log4j.properties ### 配置根 ### # log4j.rootLogger = debug,console ,fileAppender,dailyRollingFile,ROL ...

  4. 蓝牙/zigbee/nrr24xx

    目前使用的短距离无线通信技术及标准主要有Bluetooth.WIFI.ZigBee.UWB.NRF24XX系列产品等.Nordic公司生产的单片集成射频无线收发器NRF24XX系列芯片具有低功耗.支持 ...

  5. Linux 命令中 find 和 xargs 命令的用法

    find 命令(一) find 命令主要作用是沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作.Linux 下 find 命令提供了相当多的查找条件,功能很强大,对应的学习难度也比较大. ...

  6. Java的进制转换

    十进制转其它进制 其它进制转十进制 A进制转B进制可以将十进制作为中间媒介 Integer.toString(int i, int radix) 返回用第二个参数指定基数表示的第一个参数的字符串表示形 ...

  7. Dire Wolf HDU - 5115

    题目链接 一开始很自然的想到了贪心,跑了一下贪心,发现无法处理某一段已经被选走的情况,根据数据范围,区间dp比较适合,能储存区间取样信息 设dp[i][j]为已经杀死区间[i,j]的最小值,可以得到转 ...

  8. HA: Armour-Write-up

    下载地址:点我 bilibili:点我 信息收集 nmap扫存活找到IP为:192.168.116.140 ➜ ~ nmap -sn 192.168.116.1/24 Starting Nmap 7. ...

  9. Redis的人门以及使用

    1.Redis的安装 1.1centos下安装Redis 1.1.1 安装gcc 1.1.2 安装过程  图一 图三 2.Redis的启动 2.1 前端模式启动(不推荐) 截图 2.2 后端模式(推荐 ...

  10. 【原】Linux中常见服务介绍

    1.SSH介绍 简单说,SSH(Secure Shell Protocol)是一种网络协议,用于计算机之间的加密登录.在默认状态下SSH服务提供俩个服务功能,一个是提供类似telnet远程联机服务器的 ...