2013-06-19 2 views
0

배열의 모든 데이터를 기존 데이터로 유지하면서 모든 데이터 유형의 동적 배열 크기를 1 씩 늘릴 수있는 함수를 구현하려고합니다.동적 배열의 크기를 조정하는 함수

나는 우리가 정기적으로 실용적인 프로젝트를 위해 동적 배열을 사용하고 크기를 조정해야하므로이 작업을 수행하고 싶습니다. 따라서 원하는대로 벡터를 사용할 수 없습니다.

나는이 일을 할 수 있는지 먼저 알고 싶습니다. 만약 그렇다면 어떻게 누군가가 나를 보여줄 수 있는지 알고 싶습니다.

이것은 내가 지금까지 가지고있는 것입니다.

template <typename Temp> 
void incArraySize(Temp * dynamicArray, int i_Elements) 
{ 
    Temp * dummyArr = new Temp [i_Elements]; 
    for (int l = 0; l < i_Elements; l++) 
     dummyArr[l] = dynamicArray[l]; 

    delete [] dynamicArray; 
    dynamicArray = new Temp [i_Elements+1]; 

    for (int l = 0; l < i_Elements; l++) 
     dynamicArray[l] = dummyArr[l]; 

    delete [] dummyArr; 
} 

이 함수는 처음에는 제대로 작동하지만 다음 번에는 액세스 위반이 발생합니다.

답변

1

dynamicArray

void incArraySize(Temp*& dynamicArray, int i_Elements) 

그렇지 라인 dynamicArray = new Temp [i_Elements+1];의 리 바인딩은 함수 밖에 적용 할 수없는 것이며, 참조에 의해 전달한다. 이다

, 당신은 3 행에

int* array = new int[10]; 
incArraySize(array, 10); 
// line 3: 
std::cout << array[0]; 

전화, 배열은 [] incArraySize에 의해 에드 삭제할되었지만, array 변수는 여전히이 오래된, 삭제, 배열을 가리키고 있습니다. 이 때문에 액세스 위반이 발생합니다.

는 대신 std::vector<Temp>을 고려 있나요? 표준 라이브러리 유형은 메모리와 크기를 올바르게 관리 할 수 ​​있으며 사용하기가 훨씬 쉽습니다.

+0

정말 고마워요. 나는 결코 이것으로 나 자신을 얻지 못했다. 나는 아직도이 주제가 나에게 막연한 것이기 때문에 나는 포인터와 참조에 관해서 공부하기 위해 약간의 공부를하고 있다고 생각한다. –

1

배열 크기를 1 씩 늘리면 여러 번 이렇게해야 할 경우 특히 비효율적입니다. 일부 메모리를 희생하고 필요한 공간보다 더 많은 공간을 사용하거나 .push() 메서드를 사용할 수있는 목록을 사용하는 것이 좋습니다

현재 방법에서는 포인터를 새 배열에 복사하는 것처럼 보입니다. 더미 배열에서 동적 배열로 개별 값을 복사하려면 for 루프 내에서 new 키워드를 사용하여 복사 할 때마다 데이터를 전달하십시오.

0

2 부? KennyTM가 언급 했으므로 참조가 필요합니다.

template <typename Temp> 
void incArraySize(Temp *& dynamicArray, int i_Elements) 
{ 
    Temp * p = new Temp[i_Elements + 1]; 

    for (int l = 0; l < i_Elements; l++) 
     p[l] = dynamicArray[l]; 

    delete [] dynamicArray; 

    dynamicArray = p; 

} 
관련 문제