完整题目
定义一个整形数集合类Set,请通过创建动态分配的整数数组(使用new运算符)存放整数值,且数组的大小要能够根据包含元素的个数动态的变化。集合中,元素的顺序无关紧要,每个元素至多出现一次。实现如下函数:(1) 构造函数创建一个空集;(2) 复制构造函数实现深复制;(3) add 函数向集合中插入一个整数; (4) 析构函数。在main函数中对上述函数进行测试。
以下是代码,里面有很详细的解释
#include<iostream>
using namespace std;
class Set
{
public:
Set(Set& s);//复制构造函数实现深复制
Set(int n=0);//默认参数的构造函数
void add(int n);//向集合中插入一个整数
~Set();
void show();//显示集合中的元素
int& operator [](int index);//通过下标来改变数组的值
private:
int * p;
int count;
};
Set::Set(int n)
{
p = NULL;//将指针指向空
p = new int[n];
count += n;
}
Set::Set(Set& s)//复制构造函数实现深复制
{
p = new int[s.count];//s->count 是被复制的集合的元素个数
count = s.count;
for (int i = 0; i < s.count; i++)
{
*(p + i) = *(s.p + i);
}
cout << 深复制成功 << endl;
}
int& Set::operator [](int index)//通过下标来改变数组的值
{
static int temp = 0;
if (index < 0 || index >= count)
{
cout << 下标越界 << endl;
return temp;
}
return *(p + index );
}
void Set::add(int n) //向集合中插入一个整数
{
for (int i = 0; i < this->count; i++)
if (p[i] == n)
{
cout << 集合中已有该元素,无法插入 << endl;//实现集合中每个元素最多出现一次
return;
}
count++;//个数加1
int* p1 = new int[this->count];//临时申请一块空间来存数据
for (int i = 0; i < this->count-1; i++)
p1[i] = p[i];//将数据存到p1中
delete[] p;//销毁原来空间
p = new int[count];//再次申请空间
for (int i = 0; i < this->count-1 ; i++)
p[i] = p1[i];//将原先数据存到p中
p[count - 1] = n;//存入插入的元素
delete[] p1;
p1 = NULL;//要记得释放临时申请的空间
cout << 插入成功 << endl;
}
Set::~Set()
{
delete[]p;
p = NULL;
}
void Set::show()
{
for (int i = 0; i < count; i++)
{
cout << p[i] <<endl ;
if ((i+1) % 11 == 0)
cout << endl;
}
}
int main()
{
Set s;
int n, m;
cin >> n >> m;
s.add(n);
s.show();
s.add(m);
s.show();
// cout << s[0] << << s[1] << endl;
Set ss(s);
ss.show();
ss[0] = 154;
ss.show();
return 0;
}
本文介绍了一个C++实现的整数集合类,该类使用动态分配的整数数组存储元素,并能根据元素数量动态调整大小。集合中元素无序且不允许重复。类提供了构造函数、深复制构造函数、添加元素方法、析构函数以及显示元素功能。在main函数中进行了测试,展示了如何创建、添加元素、深复制以及修改集合内容。
1821

被折叠的 条评论
为什么被折叠?



