我正在创建一个自定义矢量类作为家庭作业的一部分。我目前要做的是实现一个名为erase的函数,它将整数作为参数,将数组长度减少1,删除参数指定位置的元素,最后将所有元素向下移动到填充在“擦除”元素留下的空白中。
由于我缺乏使用这种语言的经验,我不能完全理解你是如何从指针数组中删除单个元素的。
目前,我已实施以下内容:
void myvector::erase(int i)
{
if(i != max_size)
{
for(int x = i; x < max_size; x++)
{
vec_array[x] = vec_array[x+1];
}
vec_size --;
//delete element from vector;
}
else
//delete element from vector
}
类声明和构造函数如下所示:
template <typename T>
class myvector
{
private:
T *vec_array;
int vec_size;
int max_size;
bool is_empty;
public:
myvector::myvector(int max_size_input)
{
max_size = max_size_input;
vec_array = new T[max_size];
vec_size = 0;
}
我尝试了以下内容:
使用delete尝试删除元素
删除vec_size [max_size];
vec_size [max_size] = NULL;
将元素的值设置为NULL或0
vec_size [max_size] = NULL
或
vec_size[max_size] = 0
由于操作符“=”不明确或指定的类型无法转换为void *,所以这些都不适合我。
我可能错过了一些简单的东西,但我似乎无法通过这个。任何帮助将非常感激。再一次,对于缺乏经验感到抱歉,如果这是愚蠢的事情。
答案 0 :(得分:2)
如果您的自定义矢量类应该像std :: vector一样工作,那么请不要关心对象的破坏。如果您需要擦除元素,只需将其后面的所有元素复制到左侧的一个位置:
void myvector::erase(int i)
{
for (int x = i + 1; x < vec_size; x++) {
vec_array[x - 1] = vec_array[x];
}
vec_size--;
}
这是擦除()函数必须完成的所有基本工作。
如果元素恰好是指针,你就不应该关心;如果需要,vector类的用户负责删除那些指针。您无法确定它们是否可以实际删除(指针可能指向自动堆栈变量,这些变量不可删除。)
所以,不要在你的矢量元素上调用delete
。
如果您的矢量类具有clear()
函数,并且您想确保元素被破坏,那么只需:
delete[] vec_array;
vec_array = new T[max_size];
vec_size = 0;
实际上,这就是std :: vector的工作原理。 (好吧,它的基本逻辑;当然你可以在矢量实现中优化很多东西。)
答案 1 :(得分:1)
由于这是作业,我不会给你一个明确的解决方案,但这里有一种擦除价值的方法:
loop through and find value specified in erase function
mark values position in the array
starting from that position, move all elements values to the previous element(overlapping 'erased' value)
for i starting at position, i less than size minus one, i plus plus
element equals next element
reduce size of vector by 1
看看这是否是一个足够大的提示。