您的位置:首页 > 其它

C​+​+​S​T​L_set中函数_集合运算

2014-05-10 09:56 417 查看
c++第四次作业是STL应用。

就B/C两道集合运算题,百度查到相关知识——六个归并排序算法:[1]

分别为:merge(),
// 归并两个序列,元素总个数不变,只是将两上子有序序列归并为一个有序序列。

set_union(), // 实现求集合A,B的并。

set_difference(), //
实现求集合A,B的差(即A—B)。

set_intersection(),
// 实现求集合A,B交集。

set_symmetric_difference() ;// 实现求集合A,B的对称差(即 (A-B)并(B-A) ) 。

详细功能见代码:

#include<iostream>
#include<algorithm>
using namespace std;
#include<list>
#include<set>

template<class T>
void INSERT_ELEMENT(T &coll,int begin,int end)
{
for(int i=begin;i<=end;i++)
coll.insert(coll.end(),i);
}
template<class S>
void PRINT(S &coll)
{
S::iterator iter;
for(iter=coll.begin();iter!=coll.end();iter++)
cout<<*iter<<" ";
}
int main()
{
list<int> coll1;
set<int> coll2;

INSERT_ELEMENT(coll1,1,6);
INSERT_ELEMENT(coll2,3,8);
cout<<"coll1:";
PRINT(coll1);
//copy(coll1.begin (),coll1.end (),ostream_iterator<int>(cout," "));
cout<<endl<<"coll2:";
PRINT(coll2);
//copy(coll2.begin (),coll2.end (),ostream_iterator<int>(cout,"  "));
cout<<endl;

cout<<endl<<"after using merge() function:";  //函数1:merge()
merge(coll1.begin (),coll1.end(),coll2.begin (),coll2.end (),ostream_iterator<int>(cout," "));

cout<<endl<<"after using set_unoin() function:";//函数2:set_union()
set_union(coll1.begin (),coll1.end (),coll2.begin (),coll2.end (),ostream_iterator<int>(cout," "));
//set_union(),实现将前一个区间中元素与后一个区间的元素归并,但对于多于一个的相同元素,在合并的区间中的保存前两个区间中元素个数最大值。
//比如前一个区间中有两个2,后一个区间有三个2,故归并后区间中有三个2.故些算法归并后总元素个数会减少。
//就根据英文单词union意思为:并集,来理解。

cout<<endl<<"after using set_intersection() function:";//函数3:set_intersection()
set_intersection(coll1.begin (),coll1.end (),coll2.begin (),coll2.end (),ostream_iterator<int>(cout," "));
cout<<endl<<"after using set_difference() function:";//函数4:set_difference()
set_difference(coll1.begin (),coll1.end (),coll2.begin (),coll2.end (),ostream_iterator<int>(cout,"  "));
/*set_difference函数用于实现求集合A—B(即两个集合的差集,当把一个区间看成一个集合时),其中A,B分别对应第一个区间(即[coll1.begin(),coll1.end()),第二个区间(即[coll2.begin(),coll2.end()))。*/

cout<<endl<<"after using set_symmetric_difference() function:";//函数5:set_symmetric_difference().
set_symmetric_difference(coll1.begin (),coll1.end (),coll2.begin (),coll2.end () ,ostream_iterator<int> (cout," "));

//英文单词symmetric:对称,英文单词:difference:差。
//函数set_symmetric_difference求两个集合A,B的对称差(即(A—B)并(B—A))。

return 0;
}


参考资料:

[1]http://wenku.baidu.com/link?url=EnAQLy0TxccJAcNF8a58ghmaXBdR1b2vWea6xpZtD6E8GdYfEaZAc5zEp-2ksf4jGbwe9XJT5O6GRav4-dgbKJ_ep5i38wyrsOI1ltB-Ou3

附上B、C题目:

B-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

C-Description

最近Jerry正在刻苦的学习STL中的set的功能函数,他发现set可以用现有的函数实现并、交、差、对称差等功能,但是他没有找到怎么来比较两个集合是否相等的功能函数,所以他想自己用其他的功能函数来实现能判断两个集合是否相等的功能函数。聪明的Jerry不一会就想到了解决办法,现在他想拿这道题来考考你,看你有没有他聪明。

Input

输入有多组,每组数据有两行,每一行都代表一个集合,每一行有若干个正整数(0<d<=2147483647),并且每行的最后一个数字都是0,代表该行数据的结束,且末尾的0不计入集合中。最后以EOF结束输入。

Output

对于每组数据输出都要输入一个结果,如果两个集合相等便输出“YES”,否则输出“NO”,每个结果占一行

Sample Input

1 2 3 4 0

1 2 3 4 0

1 2 2 2 2 2 0

1 2 0

1 2 3 4 0

1 3 3 4 0

Sample Output

YES

YES

NO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: