reserve()는 용량을 더 할당할 때, resize()는 원소의 개수를 조절할 때
vector<type> v
v.capacity()
capacity는 배열에 할당된 메모리 용량이다. 하지만 Byte 단위로 표시되지 않고 원소의 개수 단위로 표시된다. 즉, 16byte 가 할당되었어도 원소가 int면 capacity은 4이다.
v.size()
size는 vector가 현재 갖고 있는 원소의 개수이다.
vector<int> v = {1,2,3,4}
라면 v.size() = 4 이다.
vector는 자신의 용량이 가득 찬 상태에서 원소를 삽입할 때, 공간을 새로 더 크게 할당받고 새 원소를 추가한다. 이때 새 배열에 기존 원소를 모두 복사하기 때문에 만큼의 시간이 걸린다.
원소를 추가할 때마다 재할당이 일어나면 너무 비효율적이다. 때문에 capacity는 이전 값의 배로 늘어난다(VS에서는 1.5배). capacity와 size가 나눠지게 된 것도 이 때문일 것이다.
v.reserve(n)
v.capacity() < n
라면 capacity를 n이 되게끔 재할당받는다.
재할당 시 모든 원소들이 새 배열에 먼저 복사되고(모든 원소의 복사 생성자 실행) 기존 원소들의 소멸자가 실행된다. 원소의 개수는 변함이 없으므로 size는 유지된다.
v.resize(n)
n < v.size()
라면 v.size() - n
만큼 뒤쪽 원소들이 삭제(소멸자 실행)된다.
n > v.size()
라면 n - v.size()
만큼의 원소들이 뒤쪽에 삽입(기본 생성자 실행)된다.
만약 n > v.capacity()
라면 공간을 재할당 받고
n - v.size()
만큼 새 원소 생성 -> 새 배열에 기존 원소들 모두 복사 -> 기존 원소들 삭제 순으로 연산이 일어난다.