//这道题虽然是入门题,但还是学到了很多set的姿(zhi)势(shi).
set按照字面的英文的意思来说,是‘集合’的意思。
对于大部分人来说,第一次接触这个‘集合’应该是在数学中吧,那我们回到数学中来看
由一个或多个确定的元素所构成的整体叫做集合。
若 x是集合 A的 元素,则记作 x ∈ A。集合中的元素有三个特征:
1.确定性(集合中的元素必须是确定的)
2.互异性(集合中的元素互不相同。例如:集合A={1,a},则a不能等于1)
3.无序性(集合中的元素没有先后之分),如集合{3,4,5}和{3,5,4}算作同一个集合。
计算机中的set和数学中的set其实并没有什么两样
那我们在计算机中用数组存储和set存储有什么区别呢
对于set来说,插入,删除,查询操作的复杂度都为O(lgn)
但对于数组来说,除了插入快一点,可以O(1),其他操作都需要O(n),是的的确确耗费时间的
1.引用库
在使用set时,需要
#include<set>
using namespace std;
2.操作
set<T>s // 我们定义了一个名为S,可以存储T类型数据的集合
s.insert() //向集合s中插入一个元素(不会出现重复元素在集合中)
s.erase() //删除集合s中插入的一个元素,如果不存在,则不进行任何操作
s.count() //查看集合中是否存在这个元素,存在返回1,否则为0
for (s<T>::iterator it =s.begin(); it != s.end(); ++it) //遍历元素
{
cout << (*it) << endl;
}
s.clear() //清空集合
//好了大体说了下set,以后会边做题边补充
现在来讲讲这个题
这个题意就是模拟去做AUB的集合,利用set相同元素只会存一次的性质可以轻松AC
#include<stdio.h>
#include<algorithm>
#include<set>
using namespace std;
int a[100005];
int main()
{
int n,m;
set<int>s;
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n+m;i++)
{
scanf("%d",&a[i]);
s.insert(a[i]);
}
for(set<int>::iterator i=s.begin();i!=s.end();i++)
{if(i!=s.begin())
{
printf(" ");
}
printf("%d",*i);
}
printf("\n");
s.clear();
}
}