STL set

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;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值