1

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

或者

vec_size[max_size] = 0

由于运算符“=”不明确或指定类型无法转换为 void *,因此这些都不适合我。

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

4

2 回答 2

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--;
}

这就是您的 erase() 函数必须做的所有基本工作。

如果元素恰好是指针,则不必在意;如果需要,您的向量类的用户负责删除这些指针。您无法确定它们是否真的可以被删除(指针可能指向自动堆栈变量,这些变量是不可删除的。)

因此,永远不要调用delete向量的元素。

如果你的向量类有一个clear()函数,并且你想确保元素被破坏,只需:

delete[] vec_array;
vec_array = new T[max_size];
vec_size = 0;

这就是 std::vector 实际上的工作方式。(嗯,它的基本逻辑;当然,您可以在向量实现中优化很多东西。)

于 2012-12-11T02:04:57.010 回答
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

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

于 2012-12-11T02:00:22.220 回答