시퀀스 컨테이너: vector, deque, list
알아두면 좋은 점: vector와 list의 차이
1. vector #
일반적인 배열처럼 vector는 개체들을 연속적인 메모리 공간에 저장한다.
즉, 반복자 뿐 아니라 position index(operator [])로도 접근이 가능하다.
vector는 동적으로 확장/축소가 가능한 dynamic array로 구현되어 있다.
개별 원소들을 position index(operator [])로 접근이 가능하다(상수 시간).
원소를 컨테이너 끝에 삽입/제거하는 것이 빠르다.
어떤 순서로도 원소를 순회할 수 있다. 즉, Random access iterating이 가능하다.
일반적으로 다른 두 개의 시퀀스 컨테이너인 deque, list에 비해 개별 원소에 대한 접근 속도와 컨테이너 끝에서 삽입/제거 속도가 훨씬 빠르다.
컨테이너 끝 위치가 아닌 곳에서 삽입/제거 수행 시 성능은 deque/list에 비해 현저히 떨어진다.
동적으로 컨테이너 크기가 확장/축소되기는 하나, 확장 시 reallocation의 비용이 크다. capacity에 따라 적절한 크기의 reserved 메모리 크기 확보가 중요할 수 있다.
2. deque (double ended queue) #
vector와 비슷하지만 삽입/제거와 동적 확장 방식에서 차이가 있다.
개별 원소들을 position index로 접근이 가능하다
원소를 컨테이너 끝 뿐 아니라, 앞에서도 삽입/제거하는 속도가 빠르다.
어떠한 순서로도 원소를 순회할 수 있다.
컨테이너 끝 위치가 아닌 곳에서 삽입/제거 수행 시 성능은 list에 비해 현저히 떨어진다.
2.3. vector와의 차이 #
두 번째 강점인 앞에서도 삽입/제거 속도가 빠르다. 이런 특징으로 STL의 스택과 큐의 base 클래스는 deque다.
컨테이너의 동적 확장/축소 방식이 다르다. vector의 경우 내부 capacity가 고갈되면 전체 메모리 크기만큼 reallocation이 발생한다. 하지만 deque는 일정 크기를 가지는 chunk 단위로 확장된다. 이런 차이에서 다음 같은 장단점이 있다.
장점
메모리 할당량이 큰 경우 vector에 비해 확장 비용이 절감된다.
단점
컨테이너 처음부터 끝까지 연속 메모리 공간이 아니므로 vector에서 가능했던 포인터 연산이 불가능하다.
list는 이중 연결 리스트로 구현되어 있다.
컨테이너 어느 위치에서도 삽입/제거가 빠르다(상수 시간).
원소들의 컨테이너 내 순서 이동이 빠르다(상수 시간).
원소의 position index로 직접 접근이 불가능하다. - 특정 원소에 접근하려면 처음이나 끝부터 선형 탐색을 해야만 한다.
컨테이너 내 원소 순회는 forward / reverse 순회만 가능하다. 느리다.
원소들 간 연결을 위해 추가적인 메모리가 사용된다.