2009-08-29 3 views
11

가 있습니다 말을 {벡터에서처럼}, 나는C++에서 동적으로 배열을 확장하는 방법은 무엇입니까?

int *p; 
p = new int[5]; 
for(int i=0;i<5;i++) 
    *(p+i)=i; 

는 이제 배열에 여섯 번째 요소를 추가 할 수 있습니다. 어떻게해야합니까?

+1

편집기에서 4 개의 공백을 들여 쓰면 코드는 –

+2

코드처럼 보입니다. 이런 종류의 기능을 원하면'std :: vector'를 사용하십시오.'std :: vector'를 사용하지 않는다면, C++에 대해 꽤 많이 알아야합니다. (당신이 이것을 묻기 때문에, 아직 충분하지 않습니다.) 아주 좋은 이유가 있어야합니다. 이유에 따라 대답이 다를 수 있습니다. – sbi

답변

3

malloc을 사용하여 초기 버퍼를 할당하는 경우 realloc을 사용하여 버퍼의 크기를 조정할 수 있습니다. new -ed 버퍼의 크기를 조정할 때는 realloc을 사용하지 마십시오.

int * array = (int*)malloc(sizeof(int) * arrayLength); 
array = (int*)realloc(array, sizeof(int) * newLength); 

그러나 이것은 일을하는 C-ish 방법입니다. vector을 고려해야합니다.

+4

+1 벡터 사용을 고려하십시오. – obelix

+2

일반 올드 데이터 형식에서만 작동합니다. – peterchen

+0

아마도 벡터가하는 것을 추가해야합니다. 에뮬레이트하려는 경우 새롭고 더 큰 배열을 할당하고 그 요소를 복사해야합니다. OP는 벡터를 알고 있기 때문에 아마 그것을 사용하지 않을 이유가있을 것입니다 (숙제, 아마도) – jalf

20

당신은 배열을 재 할당해야하고 데이터 복사 :

int *p; 
p = new int[5]; 
for(int i=0;i<5;i++) 
    *(p+i)=i; 

// realloc 
int* temp = new int[6]; 
std::copy(p, p + 5, temp); // Suggested by comments from Nick and Bojan 
delete [] p; 
p = temp; 
+1

이것은 'int'타입에 대해서는 괜찮지 만 사용자 정의 타입에 대해서는 'memcpy/delete []'접근 방식이 문제를 일으킬 수 있습니다. –

+0

memcpy 대신 std :: copy를 사용할 수 있습니다 - 사용자 정의 할당 연산자가있는 객체뿐 아니라 POD에서도 작동하며 정수 유형에 대해 memcpy에 최적화되어있을 가능성이 큽니다. 그러나 최적화는 구현 품질 문제입니다. –

+0

감사합니다. std :: copy로 변경했습니다. –

8

당신은 할 수 있습니다. 이를 위해서는 STL 벡터와 같은 동적 컨테이너를 사용해야합니다. 그렇지 않으면 다른 배열을 더 크게 만들 수 있으며 첫 번째 배열의 데이터를 그 배열에 복사 할 수 있습니다.

이유는 배열이 메모리의 연속 영역을 나타 내기 때문입니다. 위 예제에서 p는 0x1000을 가리키고 5 개의 int는 20 바이트에 해당하므로 배열은 0x1014의 경계에서 끝납니다. 컴파일러는 다른 변수를 0x1014에서 시작하는 메모리에 자유롭게 둘 수 있습니다. 예를 들어 int i은 0x1014.x1018을 차지할 수 있습니다. 그런 다음 배열을 확장하여 4 바이트를 더 차지하게되면 어떻게됩니까?

1

다른 사람들과 마찬가지로 말하지만 배열 크기를 자주 조정하는 경우 크기를 두 배로 늘릴 때마다 배열의 크기를 조정하는 것이 좋습니다. 끊임없이 새롭고 파괴적인 오래된 것을 창조하는 데 드는 비용이 있습니다. 따라서 배가 이론은 미래의 요소를위한 충분한 여지가 있음을 보장함으로써이 문제를 완화하려고 시도합니다.

+1

이 아닙니까? – Naveen

+0

벡터를 원하지 않는다면,이 작업을 수행 할 수 있습니다. 그러나 벡터를 구현하면이 질문을하지 않아도됩니다. – Glenn

2

vector의 소스 코드를 보시지 않겠습니까? C++ 포함 파일이있는 폴더에서이 메커니즘의 구현을 볼 수 있습니다!

여기가 GCC 4.3.2에 수행 내용은 다음과 같습니다

  1. 는 벡터의 할당의 사용과 메모리의 새로운 연속 덩어리를 할당 (당신은 벡터 vector<Type, Allocator = new_allocator> 것을 기억 하는가?). 디폴트 할당 기는 operator new() (단지 new!이 아님)을 호출하여이 덩어리를 할당함으로써 자신을 지저분하게하지 말고 new[]/delete[] stuff;

  2. 기존 배열의 내용을 새로 할당 된 배열의 내용으로 복사하십시오.

  3. 이전에 정렬 된 청크를 할당 자와 함께 폐기하십시오. 기본값은 operator delete()입니다.

(참고, 당신은 당신의 자신의 벡터를 작성려고하는 경우에, 당신의 크기가 아니 "고정 된 양만큼" "M 시간을"증가 할 것이다. 이것은 당신이 일정한 상각 시간을 달성 할 수있게된다. 예를 들어, 크기 제한을 초과 할 때마다 벡터가 두 배로 커지면 각 요소는 평균 한 번 복사됩니다.)

관련 문제