江户川乱折腾
#include<iostream> //引用输入输出流#include<vector> //引用标准向量运算库#include<algorithm> //引用标准算法库using namespace std;//定义CSet类-----------------------------------------------------------------------------class CSet;ostream& operator <<(ostream& os,CSet& Set);class CSet{private:vector<int> Set;public:CSet(){}CSet(int *nset,int n);CSet(CSet& nSet){Set=nSet.Set;}~CSet(){}CSet Union(CSet sSet);CSet Join(CSet sSet);friend ostream& operator <<(ostream& os,CSet& Set);};//CSet类构造函数,用长度为n的int数组nset来初始化CSet类,并对其元素进行排序CSet::CSet(int *nset, int n){Set.resize(n); //重设元素个数for(int i=0;i<n;i++)Set[i]=nset[i]; //复制元素sort(Set.begin(),Set.end()); //元素重排}//求两个CSet类的并集,即相同的元素只出现一次CSet CSet::Union(CSet tSet){CSet Union(*this);vector<int>::iterator iter=Union.Set.begin();for(unsigned i=0;i<tSet.Set.size();){if(iter==Union.Set.end()){Union.Set.push_back(tSet.Set[i]);iter=Union.Set.end();i++;continue;}if(tSet.Set[i]>*iter) iter++;else if(tSet.Set[i]==*iter) {iter++;i++;}else {iter=Union.Set.insert(iter,tSet.Set[i]);i++;}}return Union;}//求两个CSet类的交集,即只出现相同的元素CSet CSet::Join(CSet tSet){CSet Join;for(unsigned i=0,j=0;i<Set.size()&&j<tSet.Set.size();){if(Set[i]>tSet.Set[j]) j++;else if(Set[i]<tSet.Set[j]) i++;else{Join.Set.push_back(Set[i]);i++;j++;}}return Join;}//输出CSet的元素,支持流操作的输出ostream& operator <<(ostream& os,CSet& Set){os<<"{ "; //前面加括号for(unsigned i=0;i<Set.Set.size();i++){if(i) os<<", ";os<<Set.Set[i]; //输出每个元素,用逗号隔开}os<<"}"<<endl; //后面加括号回车return os;}//--------------------------------------------------------------------------------------void main(){int X[]={1,3,5,7,8,9},Y[]={2,4,6,7,8,10,11};//CSet就是集合CSet A(X,6),B(Y,7); //此时A={1,3,5,7,8,9},B={2,4,6,7,8,10,11}CSet C,D(C); //此时D=C=空集C=A.Union(B); //C={x|x属于A或B},即A={1,2,3,4,5,6,7,8,9,10,11}D=A.Join(B); //C={x|x属于A并且属于B},即B={7,8}cout<<A<<B<<C<<D;system("pause");}