集合使用

这个题我用了三种方法做,都是超时,最后set也超时,后来看人家的解题报告才明白,输入有问题,这种输入要考虑很多方面,今天又学到了一个分割字符串的方法,如下:

 

str1,str2都是string类型

 

描述

给定两个集合A和B的所有元素,计算它们的交、并、差集。

输入

输入数据有多组,第一行为数据的组数T,接下来有2T行,每组数据占2行,每行有若干个整数,第一行的所有整数构成集合A,第二行的所有整数构成集合B,分别用空格分隔。A和B最多分别不超过100个元素。

输出

输出A、B的交、并、差集中的所有元素(以递增顺序)。每个集合占一行,数据元素之间用空格分隔。

样例输入

1
0 1 2 3 4 5 6 7 8 8
3 6 8 9

样例输出

3 6 8
0 1 2 3 4 5 6 7 8 9
0 1 2 4 5 7

 

#include<iostream>
#include<cstring>
#include<sstream>
#include<cstdio>
#include <algorithm>
#include<set>
using namespace std;
int main()
{
    set<int>a;
    set<int>b;
    set<int>c;
    int n,x,l,aa;
    string str1,str2;

    scanf("%d",&n);
    getchar();
    while(n--)
    {
       int i=0,j=0,x=0,f=1,t;
        getline(cin,str1);
       std::stringstream ss(str1);
      while (ss>>aa)
      {
       a.insert(aa);
      }
        getline(cin,str2);
       std::stringstream ss1(str2);
      while (ss1>>aa)
      {
         b.insert(aa);
      }
        set<int>::iterator ii;
      //  set_union(a.begin(),a.end(),b.begin(),b.end(),insert_iterator(set<int> >(c,c.begin())));

        set_intersection(a.begin(),a.end(),b.begin(),b.end(),insert_iterator<set<int> >(c,c.begin()));
        l=c.size();i=0;
        for(ii=c.begin();ii!=c.end();ii++)
          {
              i++;
                if(i<l) printf("%d ",(*ii));
            else printf("%d\n",*ii);
          }
            c.clear();
        set_union(a.begin(),a.end(),b.begin(),b.end(),insert_iterator<set<int> >(c,c.begin()));
       l=c.size();i=0;
        for(ii=c.begin();ii!=c.end();ii++)
          {
              i++;
             if(i<l) printf("%d ",(*ii));
            else printf("%d\n",(*ii));
            //  if(i<l)cout<<(*ii)<<" ";
             // else cout<<(*ii)<<endl;
          }
            c.clear();
        set_difference(a.begin(),a.end(),b.begin(),b.end(),insert_iterator<set<int> >(c,c.begin()));
         l=c.size();i=0;
        for(ii=c.begin();ii!=c.end();ii++)
          {
              i++;
               if(i<l) printf("%d ",(*ii));
            else printf("%d\n",(*ii));
          }
            c.clear();
    }
    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值