2012-10-31 4 views
0

클래스 개체에있는 배열에 int를 삽입하려고하는데 잘못된 작업을 파악할 수 없습니다. 내 코드의 현재 상태로 int 배열에 절대로 삽입합니다.C++에서 배열로 동적 메모리 할당

기본적으로 내가 뭘하려고하면 삽입 (int) 그것은 배열에 남아있는 방이 있는지 확인합니다 호출 할 경우, 그것을 추가 할 것입니다, 그렇지 않으면 그것을 8로 reallocate 것이다 배열에 더 많은 공백이 있습니다. 여기

내가

bool Set::insert(int X) 
{ 
     bool Flag = false; 
     if (Num == Cap) 
     { 
       //reallocate 
       const unsigned Inc = 8; 

       int * Temp = new int[Cap+Inc]; 

       for (unsigned J=0;J<Num;J++) 
       { 
         Temp[J] = Pool[J]; 
       } 

       delete [] Pool; 
       Pool = Temp; 
       Cap = Cap+Inc; 
     } 

     if(Num < Cap) 
     { 
       Pool[Num+1] = X; 

       Flag = true; 
     } 
     return Flag; 
} 
+0

'플래그'의 요점은 '삽입'이 결코 '거짓'을 반환 할 수없는 것처럼 보입니다. –

+0

C++에는 realloc()과 같은 역할을하는 vector "renew"연산자가 있었지만 확장/축소되는 하드 배열의 끝에서 추가/제거되는 추가 보너스 생성/제거 객체가 있었으면 좋겠다. – WhozCraig

+0

':: std :: vector'를 사용하는 대신 왜 이것을하고 있습니까? – Omnifarious

답변

3

귀하의 insert 기능 Num를 업데이트하지 일하고 코드 몇 가지 관련 클래스 정보를 원하시면 여기

private: 

    unsigned Cap; // Current capacity of the set 
    unsigned Num; // Current count of items in the set 
    int * Pool;  // Pointer to array holding the items 

    public: 

    // Return information about the set 
    // 
    bool is_empty() const { return Num == 0; } 
    unsigned size() const { return Num; } 
    unsigned capacity() const { return Cap; } 

    // Initialize the set to empty 
    // 
    Set() 
    { 
     Cap = Num = 0; 
     Pool = NULL; 
    } 

이다. 시도해보십시오 Pool[Num++] = X; 또는 이와 비슷한.

+0

고마워, 나는 이것을 너무 오래 꼼짝 않고 바라 보았다. 나는 휴식을위한 그 시간을 생각한다 : D – sharkman

+1

@sharkman : 확실히. 11am 전의 커피, 위스키 이후. –

0

당신은 아마 요소의 수를 증가 할 만 이후에 새 요소를 복사 :

bool Set::insert(int X) 
{ 
    if (Num == Cap) 
    { 
     const unsigned Inc(std::max(8, 2 * Cap)); 
     std::unique_ptr<int[]> Temp(new int[Cap+Inc]); 
     std::copy(Pool.get(), Pool.get() + Num, Temp.get()); 
     Pool.swap(Temp); 
     Cap += Inc; 
    } 
    Pool[Num] = X; 
    ++Num; 

    return true; 
} 

: 첫 번째 요소는 인덱스 0 기본적으로, 당신의 insert() 기능의 모양은해야한다 물론 이것은 Poolstd::unique_ptr<int[]> (또는 필요한 경우 작성하기 쉬운 유사한 기능을 가진 무언가)으로 합리적으로 선언 된 것으로 가정합니다. 원시 포인터가 아닌 std::unique_ptr<int[]>을 사용하는 이유는 소멸 될 때 자원을 자동으로 정리한다는 것입니다. int 시퀀스를 복사해도 예외는 발생하지 않지만 int get이 std::string 또는 템플릿 매개 변수로 바뀌면 예외가 발생할 가능성이 있습니다.

+1

'Pool'에 대한 할당이 예외를 throw 할 수 있다면,'Pool [Num ++] = X; '라인은 여전히 ​​기본 보증을 위반하지 않을까요? – dyp

+0

@DyP : 좋은 지적. 나는 그것을 고쳐 줄 것이다. 감사! 하지만 기본 보증을 위반하지는 않습니다 (오브젝트가 여전히 성공적으로 삭제 될 수 있습니다).하지만 작은 변경으로 코드가 강력한 보증을 제공해야합니다. –

+0

클래스의 불변량을 생각했습니다 : Num은 (성공적으로) 할당 된 요소의 수로 해석 될 수 있습니다. 어쩌면 내 말씨가 틀렸어. – dyp