vector는 random access iterator를 지원하는 배열 기반 컨테이너다. (동적 배열)
vector의 가장 큰 특징은 원소가 메모리 공간에 연속적으로 저장된다는 점과 원소의 추가 및 삽입시에 메모리 재할당이 발생하며 어떤 경우에 상당한 비용이 들 수 있다는 점이다.
예를 들어 32byte의 메모리 공간을 가진 vector<int> 객체가 있다고 가정하자.
그렇다면 현재 객체는 8 개의 원소를 저장할 수 있는 공간을 가지고 있으며 8 개의 원소 추가 및 삽입을 메모리 재할당 없이 할 수 있다. 그러나 만약 9번째 원소를 추가하려고 할 때 메모리 재할당이 일어난다. 컴파일러마다 조금씩 차이가 있지만 현재 메모리의 절반 혹은 두배 정도의 크기를 재할당하게 된다.
전자를 예시로 들자면 이런식으로 사이클이 돌아간다.
1. 객체 내부에서 현재 메모리 공간을 확인한다.
2. 메모리 공간이 부족하기 때문에 객체는 동적 할당을 한다.
2-1. 현재 메모리 공간은 32byte이며 그의 절반인 16byte를 추가해 총 48byte의 새로운 메모리 공간을 만들어낸다.
2-2. 원래 있던 메모리 공간의 원소들을 새로운 메모리 공간에 복사하고 원래 메모리 공간은 동적 해제한다.
3. 새로운 메모리 공간 48byte가 만들어졌으니 추가 요청이 들어온 9번째 원소를 그 뒤에 추가한다.
4. 새로운 메모리 공간을 컨테이너로 지정한다.
STL에서 vector에 제공하는 함수는 이렇다.
size() : 메모리 공간에 저장된 원소의 개수를 확인한다.
capacity() : 메모리 공간을 확인한다.
reserve(n) : 메모리 공간을 n만큼 예약(할당)한다.
resize(n) : 메모리 공간에 n만큼 원소를 추가한다.
begin() : 컨테이너의 첫번째 원소의 주소를 가리키는 반복자를 반환한다.
end() : 컨테이너의 마지막 원소의 주소를 가리키는 반복자를 반환한다.
clear() : 모든 원소를 제거한다. (메모리 공간은 제거되지 않음.)
swap() : 다른 컨테이너와 원소, 메모리 공간을 서로 교환한다.
(원소와 메모리가 0인 임시 객체와 clear된 객체를 교환할 수 있음, 이런 식으로 clear한 벡터의 메모리 공간을 0으로 만들 수 있음.)