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