가 있습니다 말을 {벡터에서처럼}, 나는C++에서 동적으로 배열을 확장하는 방법은 무엇입니까?
int *p;
p = new int[5];
for(int i=0;i<5;i++)
*(p+i)=i;
는 이제 배열에 여섯 번째 요소를 추가 할 수 있습니다. 어떻게해야합니까?
가 있습니다 말을 {벡터에서처럼}, 나는C++에서 동적으로 배열을 확장하는 방법은 무엇입니까?
int *p;
p = new int[5];
for(int i=0;i<5;i++)
*(p+i)=i;
는 이제 배열에 여섯 번째 요소를 추가 할 수 있습니다. 어떻게해야합니까?
malloc
을 사용하여 초기 버퍼를 할당하는 경우 realloc
을 사용하여 버퍼의 크기를 조정할 수 있습니다. new
-ed 버퍼의 크기를 조정할 때는 realloc
을 사용하지 마십시오.
int * array = (int*)malloc(sizeof(int) * arrayLength);
array = (int*)realloc(array, sizeof(int) * newLength);
그러나 이것은 일을하는 C-ish 방법입니다. vector
을 고려해야합니다.
당신은 배열을 재 할당해야하고 데이터 복사 :
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;
이것은 'int'타입에 대해서는 괜찮지 만 사용자 정의 타입에 대해서는 'memcpy/delete []'접근 방식이 문제를 일으킬 수 있습니다. –
memcpy 대신 std :: copy를 사용할 수 있습니다 - 사용자 정의 할당 연산자가있는 객체뿐 아니라 POD에서도 작동하며 정수 유형에 대해 memcpy에 최적화되어있을 가능성이 큽니다. 그러나 최적화는 구현 품질 문제입니다. –
감사합니다. std :: copy로 변경했습니다. –
당신은 할 수 있습니다. 이를 위해서는 STL 벡터와 같은 동적 컨테이너를 사용해야합니다. 그렇지 않으면 다른 배열을 더 크게 만들 수 있으며 첫 번째 배열의 데이터를 그 배열에 복사 할 수 있습니다.
이유는 배열이 메모리의 연속 영역을 나타 내기 때문입니다. 위 예제에서 p는 0x1000을 가리키고 5 개의 int는 20 바이트에 해당하므로 배열은 0x1014의 경계에서 끝납니다. 컴파일러는 다른 변수를 0x1014에서 시작하는 메모리에 자유롭게 둘 수 있습니다. 예를 들어 int i
은 0x1014.x1018을 차지할 수 있습니다. 그런 다음 배열을 확장하여 4 바이트를 더 차지하게되면 어떻게됩니까?
vector
의 소스 코드를 보시지 않겠습니까? C++ 포함 파일이있는 폴더에서이 메커니즘의 구현을 볼 수 있습니다!
여기가 GCC 4.3.2에 수행 내용은 다음과 같습니다
는 벡터의 할당의 사용과 메모리의 새로운 연속 덩어리를 할당 (당신은 벡터 vector<Type, Allocator = new_allocator>
것을 기억 하는가?). 디폴트 할당 기는 operator new()
(단지 new
!이 아님)을 호출하여이 덩어리를 할당함으로써 자신을 지저분하게하지 말고 new[]
/delete[]
stuff;
기존 배열의 내용을 새로 할당 된 배열의 내용으로 복사하십시오.
이전에 정렬 된 청크를 할당 자와 함께 폐기하십시오. 기본값은 operator delete()
입니다.
(참고, 당신은 당신의 자신의 벡터를 작성려고하는 경우에, 당신의 크기가 아니 "고정 된 양만큼" "M 시간을"증가 할 것이다. 이것은 당신이 일정한 상각 시간을 달성 할 수있게된다. 예를 들어, 크기 제한을 초과 할 때마다 벡터가 두 배로 커지면 각 요소는 평균 한 번 복사됩니다.)
편집기에서 4 개의 공백을 들여 쓰면 코드는 –
코드처럼 보입니다. 이런 종류의 기능을 원하면'std :: vector'를 사용하십시오.'std :: vector'를 사용하지 않는다면, C++에 대해 꽤 많이 알아야합니다. (당신이 이것을 묻기 때문에, 아직 충분하지 않습니다.) 아주 좋은 이유가 있어야합니다. 이유에 따라 대답이 다를 수 있습니다. – sbi