1

我需要一些 C++ 项目的帮助。我要做的是从指针数组中删除给定的元素。教给我的技术是创建一个少一个元素的新数组,然后将旧数组中的所有内容复制到新数组中,指定元素除外。之后,我必须将旧阵列指向新阵列。

这是我已经拥有的一些代码:

顺便说一句,我正在使用自定义结构......

Data **values = null;    // values is initialized in my insert function so it is
                         //   populated
int count;               // this keeps track of values' length



bool remove(Data * x) {
    Data **newArray = new Data *[count - 1];

    for (int i = 0; i < count; i++) {
        while (x != values[i]) {
            newArray[i] = values[i];
        }
        count -= 1;
        return true;
    }
    values = newArray;

    return false;
}

到目前为止,插入函数可以工作并输出填充的数组,但是当我运行 remove 时,它​​所做的只是使数组更小,但不会删除所需的元素。我每次都使用第 0 个元素作为控件。

这是我得到的输出:

count=3 values=[5,6,7]            // initial insertion of 5, 6, 7
five is a member of collection? 0
count=3 values=[5,6]              // removal of 0th element aka 5, but doesn't work
five is a member of collection? 0
count=4 values=[5,6,5]            // re-insertion of 0th element (which is stored in
five is a member of collection? 0 // my v0 variable)

任何人都可以推动我朝着正确的方向完成这项工作吗?

4

2 回答 2

3

首先,您的代码正在泄漏内存,这不好!接下来,您只复制第一个元素,即使第一个元素恰好是您要删除的元素,也不会复制。此外,当你从你的函数返回时,你根本没有改变你的内部状态。你肯定想做一些类似的事情

Data** it = std::find(values, values + count, x);
if (it != values + count) {
     std::copy(it + 1, values + count, it);
     --count;
     return true;
}
return false;

也就是说,如果有人教你std::vector<T>在每次操作中实施诸如重新分配之类的东西,那么是时候换学校了!内存分配相对昂贵,您想避免它们。也就是说,在实现类似 a 的东西时,std::vector<T>你确实想像 a 一样实现它std::vector<T>!那就是你保留一个可能比现有元素更多的内部缓冲区,并记住你正在使用多少个元素。插入新元素时,只有在当前数组中没有空间时才分配新数组(不这样做很容易导致二次复杂度,即使总是在末尾添加元素)。删除元素时,只需将所有尾随对象向上移动一个,并记住数组中少了一个对象。

于 2012-09-16T01:44:50.627 回答
0

尝试这个:

bool remove(Data * x)
{
    bool found = false;

    // See if x is in the array.
    for (int i = 0; i < count; i++) {
        if (x != values[i]) {
            found = true;
            break;
        }
    }

    if (!found)
    {
        return false;
    }

    // Only need to create the array if the item to be removed is present
    Data **newArray = new Data *[count - 1];

    // Copy the content to the new array
    int newIndex = 0;
    for (int i = 0; i < count; i++)
    {
        if (x != values[i])
            newArray[newIndex++] = values[i];
    }

    // Now change the pointers.
    delete[] values;
    count--;
    values = newArray;
    return true;
}

请注意,有一个基本假设,如果x数组中存在,那么它只存在一次!该代码不会多次出现,这留给你,看看这是一个学校练习。

于 2012-09-16T02:25:11.260 回答