mutiset的简单介绍转载
原文链接:https://blog.csdn.net/sodacoco/article/details/84798621
c++语言中,multiset是<set>库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数是有序的,而且序列中可以存在重复的数。
简单应用:
通过一个程序来看如何使用multiset:
-
#include <string>
-
#include <iostream>
-
#include <set>
-
using namespace std;
-
void main(){
-
intx;
-
scanf("%ld",&x);
-
multiset<int>h; //建立一个multiset类型,变量名是h,h序列里面存的是int类型,初始h为空
-
while(x!=0){
-
h.insert(x); //将x插入h中
-
scanf("%ld",&x);
-
}
-
while(!h.empty()){ // 序列非空 h.empty()==true时 表示h已经空了
-
__typeof(h.begin()) c=h.begin();
-
//c指向h序列中第一个元素的地址,第一个元素是最小的元素
-
printf("%ld ",*c); //将地址c存的数据输出
-
h.erase(c); //从h序列中将c指向的元素删除
-
}
-
}
对于输入数据:32 61 12 2 12 0,该程序的输出是:2 12 12 32 61。
放入自定义类型的数据:
不只是int类型,multiset还可以存储其他的类型诸如 string类型,结构(struct或class)类型。而我们一般在编程当中遇到的问题经常用到自定义的类型,即struct或class。例如下面的例子:
-
struct rec{
-
int x,y;
-
};
-
multiset<rec>h;
不过以上的代码是没有任何用处的,因为multiset并不知道如何去比较一个自定义的类型。怎么办呢?我们可以定义multiset里面rec类型变量之间的小于关系的含义(这里以x为第一关键字为例),具体过程如下:
定义一个比较类cmp,cmp内部的operator函数的作用是比较rec类型a和b的大小(以x为第一关键字,y为第二关键字):
-
struct cmp{
-
bool operator()(const rec&a,const rec&b){
-
return a.x<b.x||a.x==b.x&&a.y<b.y;
-
}
-
};
然后将语句"multiset<rec>h ;”改成"multiset<rec,cmp>h;"这样以后,我们就告诉了序列h如何去比较里面的元素(重载运算符)
此时rec以及multiset的定义部分完整代码可参考如下:
-
struct rec{
-
int x,y;
-
};
-
struct cmp{
-
bool operator()(const rec&a,const rec&b){
-
return a.x<b.x||a.x==b.x&&a.y<b.y;
-
}
-
};
-
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的简单介绍转载的更多相关文章
- VPN理论简单介绍(转载)
标签:VPN理论简单介绍 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lvnian.blog.51cto.com/715528 ...
- Kubernetes1-K8s的简单介绍(转载)
一.简介 1.什么是Kubernetes 简称K8s,用8代替8个字符"ubernerte"而成的速写,K8s是一个开源的容器编排平台,它是一个跨主机集群的开源容器调度平台,用于管 ...
- iOS多线程编程之多线程简单介绍(转载)
一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“ ...
- IOS-UIProgressView的简单介绍
IOS-UIProgressView的简单介绍 转载:http://blog.sina.com.cn/s/blog_9c2363ad0101e1jy.html // UIProgressView的使用 ...
- Asp.net博客系统收集和简单介绍
国内Asp.net博客系统收集和简单介绍 [转载文章,仅供个人参考,引自http://www.soyaoo.com/Blog/post/92.html] 1.ZJ-Blog程序简介:基于A ...
- 【转载】JMeter学习(一)工具简单介绍
JMeter学习(一)工具简单介绍 一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静 ...
- 转载 mvc:message-converters简单介绍 https://www.cnblogs.com/liaojie970/p/7736098.html
mvc:message-converters简单介绍 说说@ResponseBody注解,很明显这个注解就是将方法的返回值作为reponse的body部分.我们进一步分析下这个过程涉及到的内容,首先就 ...
- IPv4和IPv6简单对比介绍(转载)
原链接:https://baijiahao.baidu.com/s?id=1570208896149974&wfr=spider&for=pc 在配置计算机网络,特别是内网的时候,有时 ...
- 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)
salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL) salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...
随机推荐
- ubuntu 虚拟机添加多个站点
我们安装好lamp环境,然后开始操作,比如一个站点叫test.ubuntu1.com,一个叫test.ubuntu2.com 1.修改hosts文件,路径/etc/hosts sudo vim /et ...
- border-1px的实现(stylus)如何在移动端设置1px的border
在这里我只介绍下边框的实现: 当样式像素一定时,因手机有320px,640px等.各自的缩放比差异,所以设备显示像素就会有1Npx,2Npx.为保设计稿还原度,解决就是用media + scale. ...
- ISR4K-IOS XE EPC
1.该操作在ISR4K的平台操作,简单的执行了一个控制层面的抓包 配置命令: R01#monitor capture A control-plane both R01#monitor capture ...
- web打开本地文件并读取内容
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Nginx+Openssl实现HTTPs(重点)
[root@localhost ~]# rz -E //导入jdk源码包 z waiting to receive.**B0100000023 ...
- java中关于&0xFF 的问题
最近遇到一个问题,半天也没想明白,byte temp = 0xA0,为什么System.out.println(temp),打印的值为:-96:而System.out.println(temp& ...
- 如何优雅的使用python中的代码注释
在编写代码时,确保您的代码易于被其他人理解时很重要的,给变量,函数起合适的名字以及合理的组织代码都是很好的方法. 使用代码注释时增加代码可读性的另一种方便简单且重要的方法! 1.为什么代码注释如此重要 ...
- 笔记-Python-性能优化
笔记-Python-性能优化 1. 开始 1.1. python性能差么? 做一个判断前,先问是不是. python运行效率低是事实. 1.2. 为什么? 原因: Python是 ...
- Java 常用转换
日期转换 SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = ft.par ...
- 计算xx年xx月xx日是星期几
代码: #include <iostream> #include <string> #include <vector> using namespace std; i ...