集合类Set的功能

定义一个集合类Set(一组无重复无序数据的集合),包含元素的输入、输出、插入、删除、查找等方法。

#include <iostream>
using namespace std;
const int MAX=1024;
class Set {
    int size,i; //集合元素个数
    int a[MAX]; //保存集合元素的数组
public:
    void init(); //初始化集合
    int find(int x); //搜索集合中是否存在元素x 
    void insert(int x); //往集合中插入元素x
    void del(int x); //删除元素x
    void display(); //显示集合所有元素
};

void Set::init()
{
    cin>>size;//输入个数 
    for(i=0;i<size;i++)
	cin>>a[i];
}

int Set::find(int x)
{
    for(i=0;i<size;i++)
	if(a[i]==x)
	   return i;
    return -1;//不可加else,因为return -1应在循环结束后判断失败 
}

void Set::insert(int x)
{
    if(find(x)!=-1)//在原数组中找到该数 
	cout<<x<<"已插入"<<endl;
    else if(size<MAX) 
	a[size++]=x;//个数增加 
}

void Set::del(int x)
{
    if(find(x)==-1)//在原数组中未找到该数 
	cout<<x<<"未插入"<<endl;
    else 
	for(int i=find(x);i<size-1;i++)
	a[i]=a[i+1];//数组前移 
	a[size-1]=0;//末尾补0,可去掉 
	size--;//个数减少 
}

void Set::display()
{
    cout<<"set={";
    for(int i=0;i<size-1;i++)
	cout<<a[i]<<",";
    cout<<a[size-1]<<"}"<<endl;
}
int main()
{
    Set myset;
    cout<<"1111111111111111111111111111"<<endl;
    myset.init();
    myset.insert(6);myset.insert(2);myset.insert(3);myset.insert(9);myset.insert(4);
    myset.display();
    cout<<"2222222222222222222222222222"<<endl;
    myset.del(3);
    myset.display();
    myset.del(6);
    myset.display();
    return 0;
}

在此基础上,请扩展相关功能:(1)通过构造函数实现对集合对象的初始化(2)增加集合的交、并、差等功能实现。集合是通常数学意义下的集合,即元素无序且无重复。

#include <iostream>
using namespace std;
const int MAX=1024;
class Set {
    int size,i; //集合元素个数
    int	m[MAX]; //保存集合元素的数组
public:
    Set(int a); //初始化集合
    int find(int x); //搜索集合中是否存在元素x 
    void insert(int x); //往集合中插入元素x
    void del(int x); //删除元素x
    void display(); //显示集合所有元素
    Set inter(Set & x);
    Set uni(Set & x);
    Set diff(Set & x);
};

Set::Set(int a=0)//带默认值的构造函数 
{
    size=a; 
    for(i=0;i<size;i++)
	   m[i]=i;
}

int Set::find(int x)
{
    for(i=0;i<size;i++)
	if(m[i]==x)
	   return i;
    return -1;//不可加else,因为return -1应在循环结束后判断失败 
}

void Set::insert(int x)
{
    if(find(x)!=-1)//在原数组中找到该数 
	cout<<x<<"已插入"<<endl;
    else if(size<MAX) 
	m[size++]=x;//个数增加 
}

void Set::del(int x)
{
    if(find(x)==-1)//在原数组中未找到该数 
	cout<<x<<"未插入"<<endl;
    else 
	for(int i=find(x);i<size-1;i++)
	m[i]=m[i+1];//数组前移 
	m[size-1]=0;//末尾补0,可去掉 
	size--;//个数减少 
}
Set Set::inter(Set & x)//x是myset2的引用 ,相当于(Set *this,Set &x) 
{
    Set t;
    for(int i=0;i<size;i++)//相当于i<this->size
        if(x.find(m[i])!=-1)//在myset1和myset2中都存在 ,相当于x.find(this->m[i])
	    t.insert(m[i]); 
    return t;
}

Set Set::uni(Set & x)
{
    Set t=x;//加入myset2中的数组 
    for(int i=0;i<size;i++)
        if(t.find(m[i])==-1)//myset1中独有的数 
	    t.insert(m[i]);
    return t;
}

Set Set::diff(Set & x)
{
    Set t;
    for(int i=0;i<size;i++)
	    if(x.find(m[i])==-1)//myset1中独有而myset2中没有 
		t.insert(m[i]);
    return t;
}
void Set::display()
{
    cout<<"set={";
    for(int i=0;i<size-1;i++)
	cout<<m[i]<<",";
    cout<<m[size-1]<<"}"<<endl;
}
int main()
{
    Set myset(4),myset2(4),myset3;//myset3用默认值0 
    cout<<"插入:"<<endl;
    myset.insert(12);myset.insert(5);myset.insert(9);
    myset.insert(7);myset.insert(14);
    myset2.insert(6);myset2.insert(7);myset2.insert(23);
    myset2.insert(11);myset2.insert(8);
    myset.display();
    myset2.display();
    cout<<"交集:"<<endl;
    myset3=myset.inter(myset2); 
    myset3.display();
    cout<<"并集"<<endl;
    myset3=myset.uni(myset2);
    myset3.display();
    cout<<"差集"<<endl;
    myset3=myset.diff(myset2);
    myset3.display();
    return 0;
}

集合类的实现,要求保存集合元素的数据成员不采用数组类型而是指针类型,包含元素的输入、输出、插入、删除、查找等方法

#include <iostream> 
#include <string> 
using namespace std;
class Set {
    int size;
    int * m;
    int find(int x);
public:
    Set();
    Set(int n);
    Set(const Set & x);//拷贝构造函数 
    ~Set();            //析构函数 
    void insert(int x);
    void del(int x);
    void display();
};

Set::Set()//无参构造函数 
{
    size=0;
	m=0;
}

Set::Set(int n)
{
    size=n;
    m=new int[size];//为m数组分配空间 
    for(int i=0;i<size;i++)
    m[i]=100+i;

}
Set::Set(const Set & x)//深拷贝
{	
	size=x.size;
	//或者可加上m=x.m;
	m=new int[size]; 
	for(int i=0;i<size;i++)
    m[i]=x.m[i];
}
Set::~Set()
{
    cout<<this->size<<"构造函数"<<endl;
    if(m!=0)
	delete[] m;
    m=0;
}

int Set::find(int x)
{
    for(int i=0;i<size;i++)
    if(m[i]==x)
	    return i;
    return -1;
}

void Set::insert(int x)
{
    if(find(x)!=-1)
    {
	cout<<x<<"已插入"<<endl;
    return;
    }
    else
	{
    int * t=new int[size+1];
    memcpy(t,m,(size)*sizeof(int));
    t[size++]=x;
    delete [] m;

    m=new int[size];
    memcpy(m,t,(size)*sizeof(int));
    delete [] t;
    //或者直接写m=t;
    }
}
void Set::del(int x)
{
    int y=find(x);
    if(y==-1)
	{
    cout<<x<<"未插入"<<endl;
    return;
    }
    else
	{
    int * t=new int[size-1];
    memcpy(t,m,y*sizeof(int));
    for(int i=y;i<size-1;i++)
	t[i]=m[i+1];
    size--;
    delete [] m;

    m=new int[size];
    memcpy(m,t,(size)*sizeof(int));
    delete [] t;
    或者直接写m=t;
    }
}



void Set::display()
{
    cout<<"set={";
    for(int i=0;i<size-1;i++)cout<<m[i]<<",";
    cout<<m[size-1]<<"}"<<endl;
}

int main()
{
    Set myset,myset2(2);
    cout<<"插入:"<<endl;
    myset.insert(2);myset.insert(5);myset.insert(3);myset.insert(1);myset.insert(4);
    myset.display();
    cout<<"删除:"<<endl;
    myset.del(3);
    myset.display();
    myset.del(6);
    cout<<"显示myset2:"<<endl;
    myset2.display();
    cout<<"显示myset3:"<<endl;
    Set myset3=myset;//复制 
    //myset3=myset;//赋值
    myset3.display();
    return 0;
}

赋值时可以删掉析构函数和复制构造函数,但复制时必须加上,为深拷贝。

添加交、并、差集:

#include <iostream> 
#include <string> 
using namespace std;
class Set {
    int size;
    int * m;
    int find(int x);
public:
    Set();
    Set(int n);
    Set(const Set & x);//拷贝构造函数 
    ~Set();            //析构函数 
    Set operator=(const Set & x);//赋值运算符重载函数 
    void insert(int x);
    void del(int x);
    void display();
    Set inter(Set & x);
    Set uni(Set & x);
    Set diff(Set & x);
};

Set::Set()//无参构造函数 
{
    size=0;
	m=0;
}

Set::Set(int n)
{
    size=n;
    m=new int[size];//为m数组分配空间 
    for(int i=0;i<size;i++)
    m[i]=100+i;

}
Set::Set(const Set & x)//深拷贝
{	
	size=x.size;
	//或者可加上m=x.m;
	m=new int[size]; 
	for(int i=0;i<size;i++)
    m[i]=x.m[i];
}
Set::~Set()
{
    cout<<this->size<<"构造函数"<<endl;
    if(m!=0)
	delete[] m;
    m=0;
}

Set Set::operator=(const Set & x) 
{
	size=x.size;
	m=new int[size];
	for(int i=0;i<size;i++)
		m[i]=x.m[i];
	return *this;
}

int Set::find(int x)
{
    for(int i=0;i<size;i++)
    if(m[i]==x)
	    return i;
    return -1;
}

void Set::insert(int x)
{
    if(find(x)!=-1)
    {
	cout<<x<<"已插入"<<endl;
    return;
    }
    else
	{
    int * t=new int[size+1];
    memcpy(t,m,(size)*sizeof(int));
    t[size++]=x;
    delete [] m;

    m=new int[size];
    memcpy(m,t,(size)*sizeof(int));
    delete [] t;
    //或者直接写m=t;
    }
}
void Set::del(int x)
{
    int y=find(x);
    if(y==-1)
	{
    cout<<x<<"未插入"<<endl;
    return;
    }
    else
	{
    int * t=new int[size-1];
    memcpy(t,m,y*sizeof(int));
    for(int i=y;i<size-1;i++)
	t[i]=m[i+1];
    size--;
    delete [] m;

    m=new int[size];
    memcpy(m,t,(size)*sizeof(int));
    delete [] t;
    //或者直接写m=t;
    }
}

Set Set::inter(Set & x)//x是myset2的引用 ,相当于(Set *this,Set &x) 
{
    Set t;
    for(int i=0;i<size;i++)//相当于i<this->size
        if(x.find(m[i])!=-1)//在myset1和myset2中都存在 ,相当于x.find(this->m[i])
	    t.insert(m[i]); 
    return t;
}

Set Set::uni(Set & x)
{
    Set t=x;//加入myset2中的数组 
    for(int i=0;i<size;i++)
        if(t.find(m[i])==-1)//myset1中独有的数 
	    t.insert(m[i]);
    return t;
}

Set Set::diff(Set & x)
{
    Set t;
    for(int i=0;i<size;i++)
	    if(x.find(m[i])==-1)//myset1中独有而myset2中没有 
		t.insert(m[i]);
    return t;
}

void Set::display()
{
    cout<<"set={";
    for(int i=0;i<size-1;i++)cout<<m[i]<<",";
    cout<<m[size-1]<<"}"<<endl;
}

int main()
{
    Set myset,myset2(2),myset3;
    cout<<"插入:"<<endl;
    myset.insert(2);myset.insert(5);myset.insert(3);myset.insert(1);
	myset2.insert(3);
    myset.display();
    myset2.display();

    cout<<"交集:"<<endl;
    myset3=myset.inter(myset2); //赋值给myset3,需要深拷贝,=运算符需要创造 
    myset3.display();
    
    cout<<"并集"<<endl;
    myset3=myset.uni(myset2);
    myset3.display();
    
    cout<<"差集"<<endl;
    myset3=myset.diff(myset2);
    myset3.display();
    return 0;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值