您的位置:首页 > 其它

计算集合的并 set

2018-02-28 18:00 183 查看

问题描述

给你两个集合,计算其并集,即{A}+{B}。 
注:{A}+{B}中不允许出现重复元素,但是{A} 与{B}之间可能存在相同元素。 
输入格式 
输入数据分为三行,第一行有两个数字n,m(0< n,m≤10000),分别表示集合 A 和集合 B 的元素个数。后两行分别表示集合 A 和集合 B。每个元素为不超出 int 范围的整数,每个元素之间用一个空格隔开。 
输出格式 
输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间用一个空格隔开。 
样例输入 
1 2 

2 3 
样例输出 
1 2 3

set集合是由不重复的数据组成的。set的插入、删除、查询的时间复杂度都是O(lgn)。数组插入的时间复杂度是O(1),删除查询是O(n)。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <stack>
#include <set>
using namespace std;
const int inf=0x3f3f3f3f;

int main(){
int a,b;
set<int>st1,st2;
scanf("%d%d",&a,&b);
for(int i=1;i<=a;i++){
int t;
scanf("%d",&t);
st1.insert(t);//插入顺序和存储顺序无关,按从小到大存储;如集合中已经存在插入的数据,不会再次插入
}
for(int i=1;i<=b;i++){
int t;
scanf("%d",&t);
st2.insert(t);
}
//使用迭代器遍历
for(set<int>::iterator it=st1.begin();it!=st1.end();it++){
int t=*it;
printf("%d ",t);
if(st2.count(t))/*查找:存在返回1*/ st2.erase(t);/*删除t*//*.clear()清空*/
}
if(!st2.empty())
for(set<int>::iterator it=st2.begin();it!=st2.end();it++)
printf("%d ",*it);
printf("\n");
return 0;
}
/*
1 2
1
2 3
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: