首页 > 其他分享 >multiset用法总结

multiset用法总结

时间:2024-05-03 20:22:40浏览次数:10  
标签:总结 set 元素 elem 用法 c2 multiset c1

multiset是库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在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;
        }
    };

然后将语句"multiseth ;"改成"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 产生一个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))

特殊的搜寻函数

操作 效果
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) 同上,全局函数

迭代器相关函数

操作 效果
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() 移除所有元素,将容器清空

标签:总结,set,元素,elem,用法,c2,multiset,c1
From: https://www.cnblogs.com/miao-jc/p/18171506

相关文章

  • 5.3考试总结
    今天考的好一些。(244分,rk2)T1[CF1279C]StackofPresents显而易见,每次排序的时候肯定是把先取出来的排在前面,所以只需要维护一个指针\(z\),表示目前最靠里的一个礼物,假如现在这个要取的礼物比它靠外,贡献为1,否则它之前所有礼物都在它的外侧,计算出贡献后,将\(z\)改为这个礼物......
  • 中考常见同义词和同义短语总结
    about(大约)=orsoacoupleof=several=afewa(large)numberof=manyalittle=alittlebitalotof=lotsof=many/muchapieceofadvice=asuggestionaquartertofive=fourforty-fiveateacherwithexperience=anexperiencedteachera......
  • 提高安全性,优雅实现拷贝与交换:C++中的Copy-and-Swap惯用法
     概述:拷贝并交换(Copy-and-Swap)是C++编程中的惯用法,用于实现赋值操作符和确保异常安全的拷贝构造函数。其核心思想是通过拷贝构造函数创建临时副本,再通过交换确保操作的异常安全性。这种方法在C++11之前和之后都适用,但在C++11中,移动语义和右值引用的引入使得实现可以更加高效。......
  • 操作系统总结
    首先,我们从概念说起,操作系统是一种系统软件,它是计算机硬件和其他软件之间的桥梁。它的作用便是管理和控制计算机的硬件资源,如处理器、内存、硬盘等等,操作系统的主要任务又包括进程管理、内存管理、文件系统管理、设备管理和网络管理等。操作系统的发展是从微机操作系统到多处理器......
  • 微机结构总结
    通过对微机结构的学习,我对微机有了更加全面的了解。微机,又称为“微型计算机”,是相对于大型计算机而言的。它以微处理器为核心,配合内存、输入输出接口电路和相应的辅助电路而构成的裸机。下面是他的结构组成:中央处理器(CPU):CPU是微机的核心部件,它负责执行程序中的指令,完成各种算术......
  • 操作系统总结
    操作系统的地位:操作系统是计算机硬件上加载的第一层软件,是对计算机硬件功能的首次扩充。其他软件只有在操作系统的支持下,才能对计算机硬件工作。操作系统是一种重要的系统软件。计算机硬件加上I/O管理软件称为虚拟机,虚拟机再加上文件管理软件称为较强的虚拟机,较强的虚拟机再加上......
  • 《操作系统》分析与总结
    通过这段时间对《操作系统》的学习,我有了很多感受,首先操作系统是计算机系统中最基本的系统软件之一。操作系统的主要功能包括进程管理、内存管理、文件系统管理和设备管理。现代操作系统已经具备了强大的功能和稳定性,为计算机用户提供了便利的操作环境。首先,操作系统中有内存管理......
  • 操作系统总结
    计应232朱思嘉,发表操作系统总结操作系统有两大特点,硬件相关,应用无关。操作系统包含进程。进程概念是一个具有一定独立功能程序在一个数据集合上的一次动态执行过程,进程的特点有,动态性,独立性,并发性,结构性。进程由程序+数据+PCB构成(标志性)。引入线程是将进程间的多个程序执行流并发......
  • 2024.5.2考试总结
    今天又犯傻逼错误A简单背包,背包的大小开小了,100->10B数位DP,答案与输入并不在同一数量级,但我并不这么认为,所以我使用了高精度。说来我也是真的唐,只有加减的高精度调了30分钟以上C类似后效性处理,普通DP不行,用了一种很神秘的DP本来想的缩点转化成DAG做,但是统计方案数会有重复......
  • RISC-V SoC研发flow的总结
    RISC-VSoC研发flow的总结今年的流片接近尾声了,我个人的评价是相比去年,在进度管理和流程管理上做的更好了一些。对比今年一月份开会时开会的PPT,基本上当时的规划和目标基本上都达成了。这次聊聊整个研发过程中的一些感悟。首先是对于整个团队的研发方向做了一个比较大的修正,大概......