【发布时间】: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-=?前者应该是修改副本,而不是原件。后者应该返回&而不是副本。 -
我打算根据我的导师规范使用前者。但是,我仍然不确定我的元素功能,也不知道如何修复它。
-
如果
element被指定返回一个bool(而不是一个可以用来代替bool但也有一个副作用的类型),那么我不认为operator-使用element是很实用的。相反,operator-应该只是制作当前对象的副本,跳过指定的项目。
标签: c++ memory dynamic operator-overloading