2014-03-25 73 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; 
}