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<int> v = {1,2,3,4} 라면
v.size() = 4 이다.



vector의 공간 할당


vector는 자신의 용량이 가득 찬 상태에서 원소를 삽입할 때, 공간을 새로 더 크게 할당받고 새 원소를 추가한다. 이때 새 배열에 현재 원소들의 데이터를 모두 복사하기 때문에 O(size)O(size) 만큼의 시간이 걸린다. 이런 오버헤드를 줄이기 위해서는 재할당이 일어나는 횟수를 줄여야 하는데, 원소를 추가할 때마다 재할당이 일어나면 너무 비효율적이다. 때문에 capacity는 이전 capacity의 1.5배 만큼 늘어나고(VS 기준) 따라서 capacity와 size가 나눠지게 되었다.



reserve


v.reserve(n)
v.capacity() < n 라면 v.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++, 알고리즘 공부

0개의 댓글