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 ...
随机推荐
- 手把手教你使用Hexo+GitHub搭建自己的个人博客网站
安装nodejs环境 这个直接搜索安装即可,安装完成之后,通过如下命令检测环境变量是否安装成功: λ node -v # 输出版本号 v12.13.1 正确输入版本号即可. 安装cnpm cnpm是淘 ...
- windows 配置hadoop环境
在idea运行spark程序的时候报错:java.io.IOException: Could not locate executable null\bin\winutils.exe in the Ha ...
- 实现简单HttpServer案例
<html> <head> <title>第一个表单</title> </head> <body> <pre> me ...
- PCSearch
1.hinstance:GetModuleHandle(NULL) 2.窗口直角: 方法1:在Oncreate函数中添加以下代码,然而这种方法会导致窗口阴影无效 LONG styleValue = : ...
- Codeforces Round #600 (Div. 2) - D. Harmonious Graph(并查集)
题意:对于一张图,如果$a$与$b$连通,则对于任意的$c(a<c<b)$都有$a$与$c$连通,则称该图为和谐图,现在给你一张图,问你最少添加多少条边使图变为和谐图. 思路:将一个连通块 ...
- 常用的OpenCV 2.0函数速查
OpenCV 2.0函数释义列表 1.cvLoadImage:将图像文件加载至内存: 2.cvNamedWindow:在屏幕上创建一个窗口: 3.cvShowImage:在一个已创建好的窗口中显示图像 ...
- python浅析格式化输出和深浅copy
一,格式化输出 今天主要想记录一下关于格式化输出的例子,然后结合了自己的理解,分析如下: 格式是 :百分号+占位符 主要有三种使用形式:%s (其中s表示string)表示字符串 %d (其中d表 ...
- JAVA 常用包
JAVA是以包的形式进行语言结构组织的. 引入这些包的关键词就是 import 下面说说 JAVA常用包有下面的几个 1. java.lang 这个是默认引入的,也是一个最基础的包.其中lang不是中 ...
- centos610最小安装之后 后续设置
1.网络配置 centos选择最小桌面(如果不用到类似Oracle需要用到桌面的软件,则操作系统安装最小化安装)安装之后 查看网络配置如下: 截图显示网络并未启用. 2.开启网络设置 cd /etc/ ...
- js加入收藏
<script> function AddFavorite(sURL, sTitle) { try { window.external.addFavorite(sURL, sTitle); ...