1 回答

TA贡献1851条经验 获得超5个赞
#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");
}
添加回答
举报