对于我的一项作业,我必须创建一个创建动态数组的类,并具有从数组中添加或删除数字的方法,我想出了如何执行 add 方法并且它工作正常,但我不知道如何删除一个元素并使数组的大小减一。
#include <iostream>
using namespace std;
class IntegerDynamicArray
{
public:
IntegerDynamicArray()
{
currentSize = 0;
maxSize = 10;
dynamicArray = new int[maxSize];
}
int add(int x);
bool remove(int x);
private:
int* dynamicArray;
int currentSize;
int maxSize;
};
int IntegerDynamicArray::add(int x)
{
if (currentSize == maxSize)
{
maxSize = maxSize * 2;
int* tempArray = new int[maxSize];
for (int i = 0; i < currentSize; i++)
{
tempArray[i] = dynamicArray[i];
}
tempArray[currentSize] = x;
currentSize++;
dynamicArray = tempArray;
}
else
{
dynamicArray[currentSize] = x;
currentSize++;
}
return currentSize;
}
bool IntegerDynamicArray::remove(int x)
{
for (int i = 0; i < currentSize; i++)
{
if (dynamicArray[i] == x)
{
//TODO need to delete the number and move all numbers "back" by one
return true;
}
}
return false;
}
int main()
{
IntegerDynamicArray intDynArray;
while (1)
{
char input;
cout << "Enter A for add or R for remove: ";
cin >> input;
if (input == 'A')
{
cout << "Enter number to add: ";
int x;
cin >> x;
cout << intDynArray.add(x) << endl;
}
else if (input == 'R')
{
cout << "Enter number to remove: ";
int x;
cin >> x;
cout << intDynArray.remove(x) << endl;
}
}
}
最佳答案
add 函数会泄漏内存,因为您在将 dynamicArray 分配给新内存块之前没有释放它。您还应该提供一个析构函数。使用 delete[] 而不是 delete,因为您正在分配一个数组。 remove 中的条件似乎不正确。我认为 x 表示要删除的元素,但您正在搜索 value == x 的元素。我认为你会首先验证 x 是一个有效的索引(小于当前大小),然后使用 x 从该元素循环到最后,将所有元素向前复制。然后在 currentSize 和 max size 之间进行零初始化。那将是一种方法。这看起来像作业,所以我只会提供指导而不是代码。尝试一下。根据您到目前为止所写的内容,我认为您可以弄清楚。
更新:确实,如果添加析构函数,则处理复制构造和赋值(以某种方式)至关重要。
如果你真的想删除一个值而不是元素的出现,那么我建议你像 remove 算法那样做。本质上,您将从头开始,循环并向前复制匹配的值。由于您不处理迭代器,因此您必须发挥创意并调整当前大小,但是 cplusplus.com 上的示例对于帮助您编写函数应该是无价的。尽管从技术上讲,您不必将那些“已删除”的插槽初始化为零,但我认为这是一个好主意,这样您在调试时就不会感到困惑。那些未使用的插槽中的陈旧数据无济于事,但在调试器中查看数据时可能会令人困惑。
关于c++ - 从动态数组中删除元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22646257/