从动态数组中删除一个元素
Remove an element from a dynamic array
对于我的一个作业,我必须创建一个类,创建一个动态数组,并有方法从数组中添加或删除一个数字,我弄清楚如何做添加方法,它工作得很好,但我不知道如何删除一个元素,使数组的大小减少一个。
#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表示要删除的元素,但您正在搜索值== x的元素。我认为您应该首先验证x是一个有效的索引(小于当前大小),然后使用x从该元素循环到末尾,向前复制所有元素。然后在currentSize和max size之间进行零初始化。这是一种方法。这看起来像家庭作业,所以我将只提供指导,而不是代码。试一试。根据你目前所写的,我想你应该能明白。
更新:如果添加析构函数,处理副本构造和赋值(以某种方式)是至关重要的,这是真的。
如果你真的想删除出现的值而不是元素,那么我建议你像remove算法那样做。从本质上讲,您将从头开始,循环并向前复制匹配的值。因为你没有处理迭代器,你必须有创意,调整当前的大小,但在cplusplus.com上的例子应该是非常宝贵的帮助你写你的函数。虽然从技术上讲,您不必对那些"已删除"的插槽进行零初始化,但我认为这是一个好主意,这样您在调试时就不会感到困惑。这些未使用槽中的陈旧数据没有帮助,但在调试器中查看数据时可能会让人感到困惑。
应该是这样的:
bool IntegerDynamicArray::remove(int x)
{
for (int i = 0; i < currentSize; i++)
{
if (dynamicArray[i] == x)
{
int *newArray = new int[currentSize-1];
std::copy(dynamicArray, dynamicArray+i, newArray);
std::copy(dynamicArray+i+1, dynamicArray+currentSize, newArray+i);
delete[] dynamicArray;
dynamicArray = newArray;
--currentSize;
return true;
}
}
return false;
}
如果您只想删除第一个出现,您可以这样做。我没有测试代码,但应该没问题。
bool IntegerDynamicArray::remove(int x)
{
for (int i = 0; i < currentSize; i++)
{
if (dynamicArray[i] == x)
{
for ( ; i < currentSize - 1; i++)
{
// Assign the next element to current location.
dynamicArray[i] = dynamicArray[i + 1];
}
// Remove the last element as it has been moved to previous index.
dynamicArray[currentSize - 1] = 0;
currentSize = currentSize - 1;
return true;
}
}
return false;
}
您还可以编写一个函数来删除所有出现的值,或者像@shawn1874建议的那样,您可以删除具有给定索引的项。
另一个简单的方法是:
bool IntegerDynamicArray::remove(int val)
{
int* dynarrtemp = new int[currentSize-1];
bool found = false;
for (int i = 0; i < currentSize; i++)
{
if (dynamicArray[i] == val )
found = true;
if ( found )
{
dynarrtemp[i] = dynamicArray[i + 1];
}
else
dynarrtemp[i] = dynamicArray[i];
}
delete [] dynamicArray;
dynamicArray=dynarrtemp;
currentSize = currentSize -1;
return found;
}
- lower_bound()返回最后一个元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 仅显示链表的最后一个元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- 选择一个元素而不是一个对象的数组的原因
- std::矢量保存 只推送最后一个元素
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 反转后不返回最后一个元素
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 访问 for_each 函数中的前一个元素
- 在 QListView 中显示最后一个元素
- 从 std::vector 中选择一个元素,而不是给定元素
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 遍历列表包含排除最后一个元素的内容
- 如何从一个无序集合中获取一个元素