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
Input
Output
Sample Input
Sample Output
HINT
STL set
C-Description
Input
输入有多组,每组数据有两行,每一行都代表一个集合,每一行有若干个正整数(0<d<=2147483647),并且每行的最后一个数字都是0,代表该行数据的结束,且末尾的0不计入集合中。最后以EOF结束输入。