multiset的插入、二分、迭代器写法(围绕例题讲解)

例题在最下面


m u l t i s e t multiset内部由平衡树实现

, 对于插入的数据会\color{Red}{自动从小到大排序},数据可以重复

m u l t i s e t ( e m m ) multiset非常好用(因为不会手写平衡树emm)

multiset的常用操作(绝对常用)

m u l t i s e t 创建multiset

multiset<int>mp;

插入数据

mp.insert(2);

抹除数据

mp.erase(2)

f o r 创建一个迭代器用于for循环

multiset<int>::iterator it;(it是迭代器,名字随便你)
for(;it!=mp.end();it++)
	cout<<(*it);

i t , 由于上面的it类似指针,打印出来需要加 *

m u l t i s e t multiset有自己专用的二分查找函数

multiset<int>::iterator it;
it=mp.lower_bound(x);

, l o w e r _ b o u n d x 如代码所示,lower\_bound返回第一个大于等于x的位置的迭代器

u p p e r _ b o u n d upper\_bound同理

m u l t i s e t \color{Red}multiset的常用函数

multiset<int>::iterator it;
it=mp.begin();
it=mp.end();

b e g i n ( ) 其中begin()返回第一个位置的迭代器

e n d ( ) \color{Red}但是end()函数返回的位置迭代器是开区间的

, 也就是如果你想得到最后一个位置的迭代器,需要

multiset<int>::iterator it;
it=mp.end();
it--;//往回退一格即可

以上就是常用的操作,不常用的自己补充吧

这题是很好的,简洁的multiset操作题

#include <bits/stdc++.h>
using namespace std;
int n,q,a[32768],ans;
multiset<int>mp;
int main()
{
	cin >> n;
	for(int i=1;i<=n;i++)
	{
		cin >> q;
		if( mp.empty() )	ans+=q;
		else
		{
			multiset<int>::iterator j;
			j=mp.lower_bound(q);
			int minn=abs(*j-q);
			if( j!=mp.begin() )
			{
				j--;
				minn=min(minn,abs(*j-q));
			}
			ans+=minn;	
		}
		mp.insert(q);
	}
	cout<<ans;
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/107468685
今日推荐