集合类继承的一些函数的实现的相关问题C++

原题
给定集合类的模板抽象类如下:

template

class Set

{

public:

//在集合中插入一个元素 e 

virtual void Insert(const Elem& e) = 0;

//在集合中删除一个值等于e的元素,如果删除成功则返回true,否则返回false

virtual bool Remove(const Elem& e) = 0;

//获取最早加入到集合第一个元素,该元素的值记录在参数e中返回。如果集合为空,则函数返回false,否则返回true。

virtual bool GetFirstElement(Elem& e) = 0;

//获取最晚加入到集合的元素,该元素的值记录在参数e中返回。 如果集合为空,则函数返回false,否则返回true。

virtual bool GetLastElement(Elem& e) = 0;

//获取集合的元素的个数

virtual int GetSize() = 0;

//获取集合所有元素的值记录在参数array中返回。函数返回集合元素的个数

virtual int GetElements(Elem array[ ]) = 0;

//按进入集合的次序,依次打印输出集合中的元素

virtual void Print() = 0;

//将集合s中的元素合并到当前集合中

virtual void operator += (Set<Elem> & s) = 0;

};

请实现一个继承上述抽象类的集合类ASet,并利用该集合类完成集合操作。

输入
输入数据有三行,每一行对应一个整数集合的元素,排列的顺序是各个元素进入到集合中的先后顺序。这三个整数集合依次记为集合S1、S2和S3。集合的元素的个数不超过1000个,每个元素的取值范围是1~65536。

输出
输出结果分为5行,第1行输出集合S1中第一个元素和最后一个元素;第2行输出集合S2的元素的个数;第3行按进入集合的先后顺序输出S3中的所有元素;第4行,将集合S2合并到S1后,按进入集合的先后次序打印输出S1中的元素;第5行,将集合S2减去集合S3后,按进入集合的先后次序打印输出S2中的元素。

样例输入
1 3 4 5 6 7 8
2 3 4 10 12
1 3 4 100 101

样例输出
1 8
5
1 3 4 100 101
1 3 4 5 6 7 8 2 10 12
2 10 12
我的问题是:创建集合对象时,向里面输入一些数字,后面输出的时候总是会自己添加一些数字,导致输出的结果不对,还有重载的那个函数实现有问题,所以上来问问。如果大佬愿意的话,把代码也告诉我吧,作业提交在即。

2个回答

你是用的数组,那么还需要一个变量表示有效数据的长度。

qq_40286272
qq_40286272 我是把集合存在一个数组里,要求是1000个数,我是用unsigned,下面是我写的:
2 年多之前 回复

template
class Aset :public Set{
public:
typedef unsigned setType[32];
Aset(setType x):Set(x){
setPut(S);
}
void setPut(setType S) {
unsigned x;
cin >> x;
while (x)
{
Insert(x);
cin >> x;
}
}
void Insert(const unsigned & e) {
unsigned bitMask = 1;
bitMask <<=((e - 1)%32);
S[(e-1)/32]|= bitMask;
}
bool is_exist( unsigned e) {
unsigned bitMask = 1;
bitMask <<= ((e- 1)%32);
if (S[(e-1)/32] & bitMask)
return true;
return false;
}
bool Remove(const setType & e) {
unsigned i;
if (is_exist( e)) {
unsigned bitMask=1;
bitMask <<= ((e - 1)%32);
for (i = 0; i < 32; i++) {
S[i] ^= bitMask;
}
return true;
}
return false;
}
bool Is_NULL(setType S)
{
bool t = true;
for(int i=0;i<32;i++)
if(S[i]) t= false;
return t;
}
bool GetFirstElement(unsigned & e) {
unsigned c, i;
unsigned bitMask;
if (Is_NULL(S))
return false;
else for (i = 0; i < 32; i++)
{
bitMask = 1;
for (c = 1; c <= 32; c++) {
if (S[i]& bitMask) e=i*32+c;
while (e) break;
bitMask <<= 1;
}
while (e) break;
}
cout << e;
return true;
}
bool GetLastElement(unsigned & e) {
if (Is_NULL(S)) return false;
unsigned c, i;
unsigned bitMask;

        for (i = 0; i < 32; i++)
       {
           bitMask = 1;
           for (c = 1; c <= 32; c++) {
               if (S[i] & bitMask) e =i*32+ c;
               bitMask <<= 1;
           }
       }
       cout <<e;
       return true;
   }

    int GetSize() {
        unsigned c, i;
        unsigned n = 0;
        unsigned bitMask;
        for (i = 0; i < 32; i++)
        {
            bitMask = 1;
            for (c = 1; c <= 32; c++) {
                if (S[i] & bitMask) n++;
                bitMask <<= 1;
            }
        }
        return n;
    }
    int GetElements(unsigned array[]) {
        int j = 0;
        unsigned c, i;
        unsigned bitMask;
        for (i = 0; i < 32; i++)
        {
            bitMask = 1;
            for (c = 1; c <= 32; c++) {
                if (S[i] & bitMask) {
                    array[j] = i * 32 + c;
                    cout << array[j];
                    j++;
                }
                bitMask <<= 1;
        }   

        }
        return j + 1;
        }

    void Print() {
        unsigned c, i;
        unsigned bitMask;
        if (Is_NULL(S)) {
            cout << "{    }\n";
            return;
        }
        else    for (i = 0; i < 32; i++)
        {
            bitMask = 1;
            for (c = 1; c <= 32; c++) {
            if (S[i]& bitMask) cout << i*32+c<< " ";
            bitMask <<= 1;
        }
    }
    }
    void operator += (Set<setType> & s) {
        for (int i = 0; i < 32; i++)
            S[i] |= s[i];
    }

};

改了很多次还是不对

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问