从指针数组中删除元素

时间:2012-12-11 01:50:53

标签: c++ arrays pointers vector

我正在创建一个自定义矢量类作为家庭作业的一部分。我目前要做的是实现一个名为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;
            }

我尝试了以下内容:

  1. 使用delete尝试删除元素

    删除vec_size [max_size];

    vec_size [max_size] = NULL;

  2. 将元素的值设置为NULL或0

    vec_size [max_size] = NULL

  3. vec_size[max_size] = 0
    

    由于操作符“=”不明确或指定的类型无法转换为void *,所以这些都不适合我。

    我可能错过了一些简单的东西,但我似乎无法通过这个。任何帮助将非常感激。再一次,对于缺乏经验感到抱歉,如果这是愚蠢的事情。

2 个答案:

答案 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

看看这是否是一个足够大的提示。