C++ STL vector의 reserve, resize 메소드

tktj12·2023년 7월 21일
0

reserve()는 용량을 더 할당할 때, resize()는 원소의 개수를 조절할 때

vector<type> v

C++ STL의 동적 배열인 vector는 먼저 메모리를 동적으로 할당한 후에 원소를 추가한다.



capacity


v.capacity()
capacity는 배열에 할당된 메모리 용량이다. 하지만 Byte 단위로 표시되지 않고 원소의 개수 단위로 표시된다. 즉, 16byte 가 할당되었어도 원소가 int면 capacity은 4이다.



size


v.size()
size는 vector가 현재 갖고 있는 원소의 개수이다.
vector<int> v = {1,2,3,4} 라면 v.size() = 4 이다.



vector의 공간 할당


vector는 자신의 용량이 가득 찬 상태에서 원소를 삽입할 때, 공간을 새로 더 크게 할당받고 새 원소를 추가한다. 이때 새 배열에 기존 원소를 모두 복사하기 때문에 O(size)O(size) 만큼의 시간이 걸린다.
원소를 추가할 때마다 재할당이 일어나면 너무 비효율적이다. 때문에 capacity는 이전 값의 배로 늘어난다(VS에서는 1.5배). capacity와 size가 나눠지게 된 것도 이 때문일 것이다.



reserve


v.reserve(n)

v.capacity() < n 라면 capacity를 n이 되게끔 재할당받는다.

재할당 시 모든 원소들이 새 배열에 먼저 복사되고(모든 원소의 복사 생성자 실행) 기존 원소들의 소멸자가 실행된다. 원소의 개수는 변함이 없으므로 size는 유지된다.



resize


v.resize(n)

n < v.size() 라면 v.size() - n 만큼 뒤쪽 원소들이 삭제(소멸자 실행)된다.

n > v.size() 라면 n - v.size() 만큼의 원소들이 뒤쪽에 삽입(기본 생성자 실행)된다.
만약 n > v.capacity() 라면 공간을 재할당 받고
n - v.size() 만큼 새 원소 생성 -> 새 배열에 기존 원소들 모두 복사 -> 기존 원소들 삭제 순으로 연산이 일어난다.

profile
C++, 알고리즘, UE 공부

0개의 댓글