2014-03-25 70 views
3

对于我的任务之一我必须创建一个类来创建一个动态数组,并且具有添加或从数组中删除数字的方法,我想出了如何执行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; 
     } 
    } 
} 
+1

你需要移动/由一个移动的所有后续元素。 – Aleph

+0

是否要删除数字的所有出现或仅第一次出现? –

+0

'std :: move(iterator,iterator,iterator)' –

回答

1

add函数泄漏内存,因为您在将dynamicArray分配给新的内存块之前未取消分配它。你也应该提供一个析构函数。由于您正在分配数组,因此请使用delete []而不是删除。删除中的条件似乎不正确。我会认为x表示要移除的元素,但是您正在搜索值为== x的元素。我认为你会首先验证x是一个有效索引(小于当前大小),然后使用x从该元素循环到最终复制所有元素。然后,zero在currentSize和max size之间初始化。这将是一个办法。这看起来像作业,所以我只会提供指导而不是代码。尝试一下。根据你到目前为止写的内容,我认为你可以弄清楚。

更新:确实,如果添加处理复制构造和赋值(以某种方式)非常关键的析构函数。

如果你真的想删除一个值而不是元素的出现次数,那么我建议你按照remove算法的方式去做。基本上你会从头开始,循环并向前复制匹配值。既然你没有处理迭代器,你必须发挥创意并调整你的当前大小,但是在cplusplus.com上的例子对帮助你编写函数应该是非常宝贵的。虽然在技术上你不必零初始化那些“已删除”的插槽,但我认为这是一个好主意,这样在调试时不会感到困惑。在那些未使用的插槽中陈旧的数据无助,但在调试器中查看数据时可能会引起混淆。

+0

+1用于指出内存泄漏和对析构函数的需求。 –

+0

忘记了复制构造函数和复制赋值,我不认为删除中的条件是错误的,我认为这只是一个奇怪的设计。而且,零初始化是不必要的。 –

1

如果你想删除第一次出现只有你可以做这样的事情。我没有测试代码,但它应该没问题。

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所有出现建议您可以用给定的索引中删除的项目。

0

这应该做到这一点:

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; 
}