Description
集合的运算就是用给定的集合去指定新的集合。设A和B是集合,则它们的并差交补集分别定义如下:
A∪B={x|x∈A∨x∈B}
A∩B={x|x∈A∧x∈B}
A-B={x|x∈A∧x不属于 B}
SA ={x|x∈(A∪B)∧x 不属于A}
SB ={x|x∈(A∪B)∧x 不属于B}
Input
第一行输入一个正整数T,表示总共有T组测试数据。(T<=200)
然后下面有2T行,每一行都有n+1个数字,其中第一个数字是n(0<=n<=100),表示该行后面还有n个数字输入。
Output
对于每组测试数据,首先输出测试数据序号,”Case #.NO”,
接下来输出共7行,每行都是一个集合,
前2行分别输出集合A、B,接下5行来分别输出集合A、B的并(A u B)、交(A n B)、差(A – B)、补。
集合中的元素用“{}”扩起来,且元素之间用“, ”隔开。
Sample Input
1
4 1 2 3 1
0
Sample Output
Case# 1:
A = {1, 2, 3}
B = {}
A u B = {1, 2, 3}
A n B = {}
A - B = {1, 2, 3}
SA = {}
SB = {1, 2, 3}
HINT
如果你会用百度搜一下关键字“stl set”,这个题目我相信你会很快很轻松的做出来。加油哦!
Append Code
AC代码
#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
void printf(set<int> c)//这里别忘记了和自定义一个函数一样标明类型;
{
set<int>::iterator it;//迭代器的具体说明见下面;
cout<<"{";
for(it=c.begin();it!=c.end();it++)//这里不能用it<=it.end();因为没有重载;
{
// if(i==c.end())
// cout<<*i<<"}"<<endl;
// else
// cout<<*i<<", ";
//这一块是错误的,因为这里娶不到c.end();
if(it==c.begin())//不能c.begin()+1,也就是进行加减操作等是不允许的;
cout<<*it;
else
cout<<", "<<*it;
}
cout<<"}"<<endl;
}
int main()
{
// set<int> A,B;//在这里是错误的;如果在for循环里面加上clear的话,就对了;
// set<int>A1,A2,A3,A4,A5;//在这里是错误的;如果在for循环里面加上clear的话,就对了;
int T;
cin>>T;
for(int i=1;i<=T;i++)//有2T行不意味着要实际让它有2T行;
{
set<int> A,B;
//必须在这里定义A和B,因为如果在外面定义的话,输入完一组数据之后A和B中会保留原始的数据,所以必须在里面定义,这样的话可以起到清空数据的作用;
cout<<"Case# "<<i<<":"<<endl;
int n,k;
cin>>n;
int j;
for(j=0;j<n;j++)
{
cin>>k;
//A.assign(k);//这里不能用assign,因为这里不是赋值而是一个个数据向里面插入;
A.insert(k);
//A[j]=l;错误,因为没有重载[];
}
cin>>n;
for(j=0;j<n;j++)
{
cin>>k;
B.insert(k);
}
set<int>A1,A2,A3,A4,A5;//必须在这里定义,原因与上面相同;
set_intersection(A.begin(),A.end(),B.begin(),B.end(),inserter(A1,A1.begin()));//以下集合的详细用法见下面详解;
set_union(A.begin(),A.end(),B.begin(),B.end(),inserter(A2,A2.begin()));
set_difference(A.begin(),A.end(),B.begin(),B.end(),inserter(A3,A3.begin()));
set_difference(A2.begin(),A2.end(),B.begin(),B.end(),inserter(A4,A4.begin()));
set_difference(A2.begin(),A2.end(),A.begin(),A.end(),inserter(A5,A5.begin()));
cout<<"A = ";
printf(A);
cout<<"B = ";
printf(B);
cout<<"A u B = ";
printf(A2);
cout<<"A n B = ";
printf(A1);
cout<<"A - B = ";
printf(A3);
cout<<"SA = ";
printf(A5);
cout<<"SB = ";
printf(A4);
}
return 0;
}
一、迭代器
1、迭代器操作类似于指针,但是可以用其指示容器中元素的位置,能够遍历程序中的每一个元素,
2、作用
(1)在特殊位置定位迭代器(2)检查该位置是否存在对象(3)获取指示位置的对象值(4)改变迭代器指示位置对象值(5)在迭代器指示位置插入新对象(6)将迭代器移到容器中的下一个位置
3、迭代器提供的主要操作
*iter 返回迭代器iter所指元素的引用
iter->men 解引用iter并获得该元素的名为men的成员,相当于(*iter).men
++iter 令iter指示容器的下一个元素
--iter 令iter指示容器的上一个元素
iter1==iter2 如果两个迭代器指示的是同一个元素或者它指向同一个容器的尾后迭代器,则相等.
二、set_intersection、set_union、set_difference、set_symmetric_difference
1、头文件#include <algorithm>
2、set里面有set_intersection(取集合交集)、set_union(取集合并集)、set_difference(取集合差集)、set_symmetric_difference(取集合对称差集)等函数。
3、这几个函数的前四个参数一样,只有第五个参数有多重版本。
(1)set_union(A.begin(),A.end(),B.begin(),B.end(),inserter( C1 , C1.begin() ) );
取A和B的并集并且存到C1中;
set_intersection(A.begin(),A.end(),B.begin(),B.end(),inserter( C1 , C1.begin() ) );
取A和B的交集并且存到C1中;
set_difference(A.begin(),A.end(),B.begin(),B.end(),inserter( C1 , C1.begin() ) );
取A和B的差集并且存到C1中,其中元素属于A,但是不属于B;
set_symmetric_difference(A.begin(),A.end(),B.begin(),B.end(),inserter(C1,C1.begin()));
只属于其中一个集合,而不属于两者的公共部分。
红色部分即为对称差;
前四个参数依次是第一的集合的头尾,第二个集合的头尾。第五个参数的意思是将集合A、B取合集后的结果存入集合C中。
(2)set_union(A.begin(),A.end(),B.begin(),B.end(),ostream_iterator(cout," “));
这里的第五个参数的意思是将A、B取合集后的结果直接输出,(cout," “)双引号里面是输出你想用来间隔集合元素的符号或是空格。
set_difference(A.begin(),A.end(),B.begin(),B.end(),ostream_iterator(cout,” “));
set_intersection(A.begin(),A.end(),B.begin(),B.end(),ostream_iterator(cout," “));
set_set_symmetric_difference(A.begin(),A.end(),B.begin(),B.end(),ostream_iterator(cout," “));
三、inserter
1、原理:其内部调用insert()
2、功能:在容器的指定位置插入元素
3、限制:只有提供了inset()成员函数的容器中,inserter才能派上用场. 所有STL容器都提供了inset()函数.
4、适用:所有STL容器