编写一个集合类模板Set(可以参照教材中Array类模板),Set可以包含零个或多个无序的非重复元素。具体内容如下: (1)集合类模板Set template <class T> class Set { private: T* value; //T类型指针,用于存放集合的元素的动态数组,长度为length int size; //集合大小(元素个数) int length; //动态数组长度 public: Set(int len = 50); //构造函数 Set(Set<T>& A); //拷贝构造函数 (选做) ~Set( ); //析构函数 Set<T>& operator= (Set<T>& r); //重载"="使集合对象可以整体赋值 Set<T> operator+ (Set<T>& r); //重载"+"求两个集合对象的并集 void display( ); //输出集合中所有元素 Bool isExist(T v); //判断集合中是否包含元素v void add(T v); //向集合中添加一个元素 int getSize( ) ; // 返回集合的大小 int getLength( ); // 返回动态数组value的大小 void Resize(int len); // 修改动态数组value的大小 }; (2)设计并编写main函数,测试编写的类。
时间: 2023-06-19 18:08:19 浏览: 125
以下是Set类的实现:
```c++
#include <iostream>
#include <algorithm> //用于求并集
using namespace std;
template <class T>
class Set {
private:
T* value; //T类型指针,用于存放集合的元素的动态数组,长度为length
int size; //集合大小(元素个数)
int length; //动态数组长度
public:
Set(int len = 50); //构造函数
Set(Set<T>& A); //拷贝构造函数(选做)
~Set(); //析构函数
Set<T>& operator= (Set<T>& r); //重载"="使集合对象可以整体赋值
Set<T> operator+ (Set<T>& r); //重载"+"求两个集合对象的并集
void display(); //输出集合中所有元素
bool isExist(T v); //判断集合中是否包含元素v
void add(T v); //向集合中添加一个元素
int getSize(); // 返回集合的大小
int getLength(); // 返回动态数组value的大小
void Resize(int len); // 修改动态数组value的大小
};
template <class T>
Set<T>::Set(int len) {
size = 0;
length = len;
value = new T[length];
}
template <class T>
Set<T>::Set(Set<T>& A) {
size = A.size;
length = A.length;
value = new T[length];
for (int i = 0; i < size; i++) {
value[i] = A.value[i];
}
}
template <class T>
Set<T>::~Set() {
delete[] value;
}
template <class T>
Set<T>& Set<T>::operator= (Set<T>& r) {
if (this == &r) {
return *this;
}
size = r.size;
length = r.length;
delete[] value;
value = new T[length];
for (int i = 0; i < size; i++) {
value[i] = r.value[i];
}
return *this;
}
template <class T>
Set<T> Set<T>::operator+ (Set<T>& r) {
Set<T> res(size + r.size);
res.size = size + r.size;
int i;
for (i = 0; i < size; i++) {
res.value[i] = value[i];
}
for (int j = 0; j < r.size; j++) {
if (!isExist(r.value[j])) {
res.value[i++] = r.value[j];
}
}
return res;
}
template <class T>
void Set<T>::display() {
for (int i = 0; i < size; i++) {
cout << value[i] << " ";
}
cout << endl;
}
template <class T>
bool Set<T>::isExist(T v) {
for (int i = 0; i < size; i++) {
if (value[i] == v) {
return true;
}
}
return false;
}
template <class T>
void Set<T>::add(T v) {
if (isExist(v)) {
return;
}
if (size == length) {
Resize(length * 2);
}
value[size++] = v;
}
template <class T>
int Set<T>::getSize() {
return size;
}
template <class T>
int Set<T>::getLength() {
return length;
}
template <class T>
void Set<T>::Resize(int len) {
T* temp = new T[len];
int n = min(len, length);
for (int i = 0; i < n; i++) {
temp[i] = value[i];
}
delete[] value;
value = temp;
length = len;
}
int main() {
Set<int> s1(5);
s1.add(1);
s1.add(2);
s1.add(3);
s1.add(4);
s1.display(); //1 2 3 4
Set<int> s2(5);
s2.add(3);
s2.add(4);
s2.add(5);
s2.add(6);
s2.display(); //3 4 5 6
Set<int> s3 = s1 + s2;
s3.display(); //1 2 3 4 5 6
return 0;
}
```
在main函数中,我们创建了两个集合s1和s2,并向它们中添加元素。然后,我们调用重载运算符“+”求它们的并集s3,并输出s3中的元素。输出结果如下:
```
1 2 3 4
3 4 5 6
1 2 3 4 5 6
```
阅读全文