set是一个集合,它里面的元素是唯一的.
multiset也是一个集合,但里面的元素可以出现多次.
集合中一些函数:
begin(); //返回第一个元素的迭代器(指针)
rbegin(); //返回最后一个元素的反向迭代器
end(); //返回最后一个元素,注意这里的最后一个元素并不是集合内部的,而是集合最后一个元素的下一个迭代器
rend(); //返回第一个元素的反向迭代器
erase(); //删除集合中某一元素,参数即为被删元素
insert(); //向集合中添加元素,参数被添加元素
lower_bound(); //返回指向大于或者等于某值的迭代器
size(); //返回集合中元素个数
count(); //返回某个值元素的个数,返回值为1或者0,不支持multiset
其余函数现在用的少,自行百度~
set和multiset默认的基本类型排序为从小到大排序,对基本的从大到小排序可以
set<Type,greater<Type> >进行排序
其余的自定义类型,则需要自己写比较函数
推荐使用 struct Comp
{
bool operator() (const void* p1,const void *p2)
{
}
};
进行比较~
hdu 4339 可用
nyoj 55 优先级队列
附代码:
NYoj 55
#include<iostream>
#include<set>
#include<stdio.h>
using namespace std;
int main()
{
int test,num,fruit,i;
scanf("%d",&test);
while(test--)
{
multiset<int> s;
int sum=0,temp1,temp2;
scanf("%d",&num);
for(i=0;i<num;++i)
{
scanf("%d",&fruit);
s.insert(fruit);
}
while(s.size()!=1)
{
temp1=*s.begin(); s.erase(s.begin());
temp2=*s.begin(); s.erase(s.begin());
sum=sum+temp1+temp2;
s.insert(temp1+temp2);
}
cout<<sum<<endl;
}
}
hdu 4399
//View Code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<set>
#define MAXN 1000010
using namespace std;
char s[2][MAXN];
int main()
{
int test,n,i,j,len1,len2,p,q,k=1;
char c[2];
multiset<int>ms;
multiset<int>::iterator it;
scanf("%d",&test);
while(test--)
{
ms.clear();
scanf("%s",s[0]);
scanf("%s",s[1]);
len1=strlen(s[0]);
len2=strlen(s[1]);
i=0;
while(i<len1&&i<len2)
{
if(s[0][i]!=s[1][i]) ms.insert(i);
i++;
}
ms.insert(i);
printf("Case %d:\n",k++);
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&p);
if(p==2)
{
scanf("%d",&j);
it=ms.lower_bound(j);
printf("%d\n",*it-j);
}
else
{
scanf("%d %d %s",&q,&j,c);
q--;
if(s[0][j]!=s[1][j]) ms.erase(j);
s[q][j]=*c;
if(s[1-q][j]!=s[q][j]) ms.insert(j);
}
}
}
return 0;
}