定义一个集合类Set,(考察动态数组的建立)

本文介绍了一个C++实现的整数集合类,该类使用动态分配的整数数组存储元素,并能根据元素数量动态调整大小。集合中元素无序且不允许重复。类提供了构造函数、深复制构造函数、添加元素方法、析构函数以及显示元素功能。在main函数中进行了测试,展示了如何创建、添加元素、深复制以及修改集合内容。

完整题目

定义一个整形数集合类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;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落春只在无意间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值