我尝试编写一个获取对象(“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类的成员。 问题是我得到一个无限循环,因为我减少了我。我无法弄清楚如何解决这个问题。有什么想法吗?
答案 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)
此功能将:
首先,这个功能很糟糕有三个原因:
如果没有立即找到对象,那么当你减少索引时,数组会卡住,然后使用循环增加它 - 你永远不会再移动。
Stone * temp = new Stone [size - 1]; //分配新数组 for(int i = 0; i
<强>相反:强>
temp = found object
Copy temp_array[i] and increment i if and only if temp_array[j] is not marked/deleted. Increment j
再一次,您可以决定使用单独的索引 - 一个用于解析原始数组,另一个用于填充新数组。