【问题标题】:Deleting an element from an array of pointers从指针数组中删除元素
【发布时间】:2012-12-11 01:50:52
【问题描述】:

我正在创建一个自定义矢量类作为家庭作业的一部分。我目前正在尝试做的是实现一个名为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 *,因此这些都不适合我。

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

【问题讨论】:

  • 您没有在此处使用指针数组,而是在使用对象数组。因此,您不需要删除任何内容 - 只需覆盖元素并缩小向量。另外,在对象的析构函数中调用delete[] vec_array,看起来你的大小逻辑也有一个错误。
  • 是的。您在尺寸错误中是正确的。谢谢你。已编辑。
  • @Johnny 看来您是 SO 新手(这是您的第一个问题。)请记住对对您有帮助的答案投票并接受对您最有帮助的答案。

标签: c++ arrays pointers vector


【解决方案1】:

如果您的自定义向量类应该像 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 实际上的工作原理。 (嗯,它的基本逻辑;当然你可以在向量实现中优化很多东西。)

【讨论】:

  • 非常感谢您的回答。这正是我一直在寻找的。我想我是想把超出这个任务范围的事情复杂化。
  • @Johnny 那么我猜这个作业给了你一个非常重要的教训。我并不是说如何编写矢量代码……祝你以后的作业好运!
【解决方案2】:

由于这是家庭作业,我不会给你一个明确的解决方案,但这里有一种擦除值的方法:

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

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

【讨论】:

    猜你喜欢
    • 2018-11-04
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多