multiset

 

声明一个multiset,按升序排列,默认升序排列
 multiset<int>set1;
 等价于:
 或 multiset<int,less<int>>set1;

声明一个multiset,按降序排列
multiset<int, greater<int>>set1;

 

函数 用法 作用
insert() set1.insert(n)   向集合插入元素n,n可以为重复值
erase() set1.erase(10)  在set1中删除元素等于10的所有副本
empty() set1.empty()   返回值bool类型,若set1为空,则返回true
swap() set1.swap(set2) 将set1和set2交换
size() set1.size()  返回值为int类型,set1当前存放的元素的个数
find() set1.find(n)  返回iterator,指向第一个找到数值n的位置,若找不到则返回的iterator等于set1.end()
resize() set1.resize(10)  重置set1的大小为10
lower_bound() set1.lower_bound(n)  返回set1中第一个找到数值n的位置的iterator,如果找不到则返回end()
upper_bount() set1.upper_bound(n)  返回set1中最后一个找到数值n的位置的后一个位置的iterator,如果找不到则返回end()
count()   set1.count(n)   确定set1中数值n出现的次数

multiset<int>q;
//定义一个multiset,尖括号里写类型
//如果是自定义类型,需要重载小于号 

q.insert(x);
//插入一个数 x 

q.clear();
//清空 

q.erase(x);
//删除容器中的所有值为 x 的数 

q.erase(it);
//删除容器中迭代器it指向的元素 

q.empty();
//返回bool值,如果容器为空返回true,否则返回false 

q.size()
//返回元素个数

q.begin();
//返回首个元素的迭代器 

q.end();
//返回最后一个元素的下一个位置的迭代器 

q.count(x);
//返回容器中 x 的个数 

q.find(x);
//返回容器中第一个x的位置(迭代器),如果没有就返回q.end() 

q.lower_bound(x);
//返回容器中第一个大于等于x的数的迭代器 

q.upper_bound(x);
//返回容器中第一个大于x的数的迭代器 
//https://www.luogu.com.cn/problem/P5076

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int n,m,res,t;
multiset<int>s;
signed main()
{
    cin>>t;
    s.insert(-2147483647);
    s.insert(2147483647);
    //提前放入这两个数,避免错误
    while(t--){
        cin>>n>>m;
        if(n==1){
            auto x=s.lower_bound(m);
            //auto是自动判断数据类型,只有C++14以上才支持
            //可以写作multiset<int>::iterator,因为lower_bound方法返回的是迭代器
            // it 取得 x 的位置
            int pos=0;
            for(auto i=s.begin();i!=x;i++,pos++);
            cout<<pos<<endl;
        }
        else if(n==2){
            int pos=-1;
            for(int i:s)
                if(++pos==m) cout<<i<<endl;
                //缩写,order先自增一,再判断是否与x相等
                //如果是(order++==x),那就是先判断再自增,这里要尤其注意
                
                //注意这里的for(:)循环,是只有C++11以上才支持的
            //和auto一样,都是noip不能用的
            //这种循环,i就是容器里的值而不是下标
            //也可以使用迭代器循环,上面的循环等价于
            /*
                for(multiset<int>::iterator it=q.begin();it!=q.end();it++)
                {
                    order++;
                    if(order==x)
                        printf("%d\n",*it);
                }
            */
            //这种循环是noip可以使用的
        }
        else if(n==3){
            auto x=s.lower_bound(m);
            cout<<*--x<<endl;
            //这句是先自减,再输出,是缩写
            //等价于:
            /*
                it--;
                printf("%d\n",*it);
            */
            //因为是迭代器(指针),所以输出前面加 
        }
        else if(n==4) cout<<*s.upper_bound(m)<<endl;
        else s.insert(m);
    }
    return 0;
}

 

posted @ 2023-09-06 14:07  o-Sakurajimamai-o  阅读(12)  评论(0编辑  收藏  举报
-- --