【问题标题】:Set Intersection Method and operator overloading设置交集方法和运算符重载
【发布时间】:2015-11-14 15:08:46
【问题描述】:

所以下面我有以下代码块。它是一个默认构造函数,默认参数为 10。下一个方法是交集方法,它采用两个集合对象的交集。此外,还有一个检查元素的元素方法。接下来是一个运算符重载方法,它应该从集合中删除一个元素。以下是我遇到的一些问题:

-intersection 方法将元素显示为 0,即使它应该显示两个集合之间共享的元素。例如,当我输入集合 {1,2} 和另一个集合 {2,3,4} 它应该显示 {2},但它显示 0。令人惊讶的是,当我检查集合 C 的大小时显示为1,正确。

-operator-()函数应该删除和元素,但删除集[i]不起作用

最后,我知道我使用的变量名称,但我使用这些名称是为了更好地了解正在发生的事情。另外,我们不允许使用标准库中的集合

Set::Set ( int s ){

        if ( s > 0 )
                psize = s;
        else
                psize = DEFAULTSIZE;
        //allocate an array of specified size
        set = new int[ psize ];

        if(!set) {
                //send an error is system cannot allocate memory
                cout << "Cannot Allocate Memory, exiting program... " << endl;
                exit (1);
        }

        for ( int i = 0; i < psize; i++){
                set[i] = 0;
                numOfElements = 0;
        }
}
Set Set::operator-( int n ){
        for ( int i = 0; i < numOfElements; i++){
                if(element(n)){
                        delete set[i];
                        numOfElements--;
                }
        }
        psize = numOfElements;

        return (*this);
}
Set Set::Intersection( Set &B ) {

        int newsize = numOfElements;

        Set C(newsize);
        int indx = 0;
                for ( int i = 0; i < numOfElements; i++ ){
                        if( B.element(set[i])){
                                C.set[indx] = set[i];
                                indx++;
                        }
                        else{
                                newsize--;
                                continue;
                        }
                }

        C.numOfElements = newsize;

        return C;
}
bool Set::element ( int n ){
        for ( int i = 0; i < psize; i++){
                if ( set[i] == n )
                        return true;
        }
        return false;
}

【问题讨论】:

  • numOfElements 是填充大小的占位符(这是我必须命名的)。 psize 是数组的物理大小
  • 我不知道delete set[i]; 是什么意思,也不知道为什么可以编译它,因为set 显然是int*。由于序列在“集合”中通常不重要,因此删除项目的常用方法是移动物理上最后一个覆盖它:set[i]=set[--numOfElements]; 但是,element(n) 测试也不可靠,因为您需要知道 set[i]==n 是否适用于当前的i,而不仅仅是它是否在某个地方。
  • 另外,您打算使用operator- 还是operator-=?前者应该是修改副本,而不是原件。后者应该返回 &amp; 而不是副本。
  • 我打算根据我的导师规范使用前者。但是,我仍然不确定我的元素功能,也不知道如何修复它。
  • 如果 element 被指定返回一个 bool (而不是一个可以用来代替 bool 但也有一个副作用的类型),那么我不认为operator- 使用 element 是很实用的。相反,operator- 应该只是制作当前对象的副本,跳过指定的项目。

标签: c++ memory dynamic operator-overloading


【解决方案1】:

最大的错误是第一个i in

C.set[i] = set[i];

你没有密集填充 C.set,但你稍后计算它的大小,就像你已经密集填充它一样。

【讨论】:

  • 感谢您的反馈!我将如何修复它?
  • 我明白你在说什么非常感谢你的帮助!
  • 您是否对如何修复我的 operator- () 函数有任何见解?
  • 如果您解决了问题但仍需要更多帮助,请编辑发布的代码。我更喜欢查看我要诊断的任何内容的当前版本。
  • 我已根据您的建议上传了修改后的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 2012-06-19
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
相关资源
最近更新 更多