STL ( Standard Template Library ) 컨테이너
- STL 컨테이너 종류로는 시퀀스 컨테이너, 어댑터 컨테이너, 연관 컨테이너가 있습니다.
시퀀스 컨테이너
list
- list 는 이중 링크드 리스트로 구현된 컨테이너입니다.
장점
- 정렬이 가능합니다.
- 중간에 데이터를 삽입하거나 삭제할 때 새롭게 연결만 해주면 되기 때문에 오버헤드가 적습니다.
- 저장할 요소의 개수를 미리 알 수 없을 때 사용하기에 적합합니다.
단점
- 랜덤 액세스가 불가능합니다.
- 순회할 때 스페이셜 로컬리티의 이점을 얻을 수 없습니다.
사용하기 적합한 경우
- 저장한 요소의 개수가 빈번하게 변화할 때
- 삽입, 삭제가 빈번하게 발생될 떄
- 랜덤 액세스가 필요하지 않을 때
vector
- vector 는 배열로 구현된 컨테이너입니다.
- 저장할 요소의 개수가 최대 크기를 넘어설 경우 현재 크기의 *2 만큼의 배열을 새로 확보한다.
장점
- 정렬이 가능합니다.
- 인덱스를 이용한 랜덤 액세스가 가능합니다.
- 순회할 때 스페이셜 로컬리티의 이점을 얻을 수 있습니다.
단점
- 중간에 데이터를 삽입하거나 삭제할 때 복사 오버헤드가 발생합니다.
- 저장할 요소의 개수가 현재 컨테이너 크기보다 클 경우 새롭게 메모리를 확보하고 복사하는 오버헤드가 발생합니다.
사용하기 적합한 경우
- 저장할 요소의 개수가 일정할 때
- index를 이용한 랜덤 액세스가 필요할 때
- 잦은 순회가 필요할 때
어댑터 컨테이너
stack
- LIFO ( Last in first out ) 의 특징을 가진 컨테이너입니다.
queue
- FIFO ( First in first out ) 의 특징을 가진 컨테이너입니다.
priority_queue
- 힙 자료구조의 컨테이너입니다.
연관 컨테이너
map, set
- 자가 균형 이진 탐색트리인 레드-블랙 트리로 구현된 컨테이너입니다.
- key, value 를 한 쌍으로 저장하는 컨테이너입니다.
- multimap, multiset 을 이용하면 중복 key 저장이 가능합니다.
장점
- key를 기준으로 정렬이 가능합니다.
- 랜더 액세스가 가능합니다.
단점
- 시간 복잡도가 O(log N) 으로서 저장하는 데이터가 많아질 수록 검색 성능이 떨어집니다.
사용하기 적합한 경우
- key를 이용한 랜덤 액세스가 필요할 때
- key를 기준으로 정렬이 필요할 때
unordered_map, unordered_set
- 해쉬 테이블로 구현된 컨테이너입니다.
- key, value 를 한 쌍으로 저장하는 컨테이너입니다.
- unordered_multimap, unordered_multiset 을 이용하면 중복 key 저장이 가능합니다.
장점
- key 해쉬를 이용한 랜덤 액세스가 가능하기 때문에 저장할 요소의 개수의 상관없이 일정한 검색 시간 복잡도를 가집니다.
단점
- 정렬이 불가능합니다.
- 저장할 요소의 개수가 적다면은 오히려 해쉬 함수로 인해 성능이 떨어질 수 있습니다.
- 해쉬 충돌이 발생될 경우 그만큼 검색 시간 복잡도가 증가합니다.
사용하기 적합한 경우
- key를 이용한 랜덤 액세스가 필요할 때
- 정렬이 필요하지 않을 때
- 많은 양의 데이터를 저장해야 할 때
- 많은 양의 데이터를 저장해도 일정한 검색 시간 복잡도를 원할 때
STL 컨테이너 비교
컨테이너 | 자료구조 | 검색 시간 복잡도 | 랜던 액세스 | 정렬 |
---|---|---|---|---|
list | 이중 링크드 리스트 | O ( N ) | X | O |
vector | 배열 | O ( 1 ) | O | O |
map, set | 레드-블랙 트리 | O ( log N ) | O | O |
unordered_map, unordered_set | 해쉬 테이블 | O ( 1 ) | O | X |
'Programming Language > C, C++' 카테고리의 다른 글
'if-else'문과 'switch-case'의 차이점 (0) | 2022.10.10 |
---|---|
래퍼런스( Reference )와 포인터( Pointer )의 차이 (0) | 2022.10.08 |
C++ 포인터 ( Pointer ) 와 const (0) | 2022.10.04 |
C++ STL ( Standard Template Library ) 이란? (0) | 2022.09.27 |
C++ 캐스트 정리 및 사용해야 하는 이유 (0) | 2022.09.20 |