我正在尝试实现一个insert()函数,该函数应该将值插入到布尔数组中,并将索引等于该值设置为“true”。 IntSet
对象有一个指针value
到一个布尔数组和一个int size
,用于保存数组的大小。所以IntSet A(2, 4, 10);
将创建一个大小为10的数组,而将2,4,10的索引设置为true。
insert()函数返回true或false,具体取决于它是否插入了值,如果插入的值大于数组的大小,它应该调整数组的大小。因此,A.insert(1000);
会将数组的大小调整为1001,并将索引1000处的值设置为true。
我的问题是删除旧的数组指针并将其设置为新的已调整大小的数组。无论我做什么,它总是在删除[]时打破,我不知道为什么。
这是我到目前为止所做的:
bool IntSet::insert(int toInsert) {
int tempSize = this->size;
// if toInsert is greater than the number of elements in the array, call
// copy constructor and assign new value to true
if(toInsert < this->size && toInsert >= 0) {
value[toInsert] = true;
return true;
}
IntSet largerSet(toInsert+1);
if(toInsert > this->size+1) {
for(int i = 0; i < largerSet.size+1; i++) {
largerSet.value[i] = false;
}
largerSet.value[toInsert] = true;
for(int i = 0; i < tempSize+1; i++) {
if(this->value[i] != false) {
largerSet.value[i] = true;
}
}
std::swap(value, largerSet.value);
std::swap(size, largerSet.size);
}
return true;
}
编辑:使用swap将值移动到当前数组。
我希望我的解释清楚,如果您需要更多说明,我很乐意提供更多代码。这是一个课堂作业,所以我不期待直接的答案,但任何可以指向正确方向的东西都会有很大的帮助。
全部谢谢!
答案 0 :(得分:1)
您应该将分配留给构造函数,将解除分配留给析构函数,复制到复制构造函数和复制赋值运算符。你现在有一个功能可以做一些事情。
重新分配的一种简洁方法是首先提供swap
函数(交换指针+大小);在此基础上,创建新大小的临时值(如largerSet
),初始化新数据,然后将您的集合与largerSet
交换。当临时超出范围时,它会被破坏,并自动调用delete[]
。
现在当largerSet
超出范围时,largerSet.value
会被删除(我假设这是在您的析构函数中完成的),但现在这等于value
,因此您的数据已消失。< / p>