2014-03-25 4 views
3

동적 배열을 만들고 배열에 숫자를 추가하거나 제거하는 메서드가있는 클래스를 만들어야합니다.이 메서드를 추가하는 방법을 알아 냈습니다. 잘 작동하지만 요소를 제거하고 배열 크기를 하나씩 줄이는 방법을 알아낼 수 없습니다.동적 배열에서 요소 제거

#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가 아닌 delete []를 사용하십시오. remove 내의 조건이 올바르지 않은 것으로 나타납니다. x는 제거 할 요소를 나타내지 만 값 == x 인 요소를 검색한다고 생각합니다. 나는 당신이 먼저 x가 유효한 인덱스 (현재 크기보다 작다)를 검증 한 다음, x를 사용하여 그 요소에서 모든 요소를 ​​앞으로 복사하는 끝으로 반복 할 것이라고 생각할 것이다. 그런 다음 0을 현재 크기와 최대 크기 사이에서 초기화합니다. 그것은 그것을하는 한 가지 방법 일 것입니다. 이 모양은 숙제와 같아서 코드 만 제공하고 지침은 제공하지 않습니다. 시도 해봐. 당신이 지금까지 쓴 것을 바탕으로, 나는 당신이 그것을 이해할 수 있다고 생각합니다.

업데이트 : 복사 구성 및 할당을 처리하는 소멸자를 추가하는 것이 중요합니다.

실제로 요소가 아닌 값의 발생을 제거하려면 remove 알고리즘과 유사하게 수행하는 것이 좋습니다. 본질적으로 처음부터 시작하여 루프 된 값과 일치하는 값을 전달합니다. 반복자를 다루지 않으므로 창의력을 발휘하고 현재 크기를 조정해야하지만 cplusplus.com에있는 예제는 함수를 작성하는 데 매우 중요합니다. 기술적으로 "제거 된"슬롯을 0으로 초기화 할 필요는 없지만 디버깅하는 동안 혼동하지 않도록하는 것이 좋습니다. 사용되지 않는 슬롯의 오래된 데이터는 도움이되지 않지만 디버거에서 데이터를 보는 동안 혼란 스러울 수 있습니다.

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