从对象数组中删除元素

时间:2015-04-12 11:36:48

标签: c++ arrays pointers

我尝试编写一个获取对象(“Stone”)并从给定数组中删除石头的函数。代码:

void Pile::del_stone(Stone &s)
{
    Stone *temp = new Stone[size - 1];//allocate new array
    for (int i = 0;i <size;++i)
    {
        if (s != Pile_arr[i])//if the given object to delete is different from the current 
        {
            temp[i] = Pile_arr[i];//copy to the new array
        }
        else
        {
            i--;
        }
    }

    Pile_arr = temp;
    set_size(this->size - 1);
    temp = NULL;
    delete[] temp;
}

Pile_arr是Pile类的成员。 问题是我得到一个无限循环,因为我减少了我。我无法弄清楚如何解决这个问题。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

使用两个索引:i和j。使用i知道你正在寻找的原始数组的哪个元素,以及j知道将元素放在temp中的位置。

答案 1 :(得分:1)

您需要使用单独的计数器来跟踪新元素的放置位置。 我在下面使用了n

Stone *temp = new Stone[size - 1];
int n = 0; // Stores the current size of temp array
for (int i = 0;i <size;++i) {
    if (s != Pile_arr[i]) {
        temp[n++] = Pile_arr[i];
    }
}

还值得考虑在数组中找不到s的情况,因为这会导致运行时错误(尝试将size元素添加到大小为size - 1的数组中)

使用STL容器将是一个更好的选择。

答案 2 :(得分:0)

此功能将:

  • 分配长度 size-1
  • 的新数组
  • 搜索目标对象
    • 如果找到,请将其复制到数组中的相同位置
    • 如果你不--i
    • 最后,++ i

首先,这个功能很糟糕有三个原因:

  1. 它只复制一个项目 - 给定项目。你有一个只有一个对象的数组。
  2. 它将项目从索引复制到索引。由于最终数组较小,如果对象处于最大原始索引,则它将超出新数组的范围。
  3. 如果没有立即找到对象,那么当你减少索引时,数组会卡住,然后使用循环增加它 - 你永远不会再移动。

    Stone * temp = new Stone [size - 1]; //分配新数组 for(int i = 0; i

  4. <强>相反:

    1. 缓存找到的对象,然后将其从原始阵列中删除或标记它。 temp = found object
    2. 逐个复制数组,不复制空格并缩小间隙。 Copy temp_array[i] and increment i if and only if temp_array[j] is not marked/deleted. Increment j
    3. 决定将找到的对象放在哪里。
    4. 再一次,您可以决定使用单独的索引 - 一个用于解析原始数组,另一个用于填充新数组。