Page 15 -
P. 15
행 시간에 조절할 수 없다. 메모리 사용량을 최소화하도록 성능을 최적화한 것이다. std::vector
는 새로운 원소를 맨 뒤에 추가하는 반면, std::deque는 원소를 맨 앞에도 추가할 수 있다.
std::list는 이중 연결 리스트(doubly-linked list)이고, std::forward_list은 단일 연결 리스트 1
(singly-linked list)다. 둘 다 컨테이너에서 임의의 지점에 매우 빠르게 접근하도록 최적화됐다.
연관 컨테이너(associative container)는 키-값 쌍으로 구성된 컨테이너로, 주어진 키에 대해 값을 표준 라이브러리
제공하는 형태로 구성된다. 연관 컨테이너는 이름을 키로 입력하면 전화번호를 알려주는 전화번
호부 같은 기능을 구현하는 데 주로 사용된다. C++는 여덟 가지 연관 컨테이너를 제공하며, 정
렬 연관 컨테이너와 비정렬 연관 컨테이너로 분류한다. 정렬 연관 컨테이너는 키를 기준으로 정
렬하며 std::set, std::map, std::multiset, std::multimap 등이 있고, 비정렬 연관 컨테이너는
std::unordered_set, std::unordered_map, std::unordered_multiset, std::unordered_multimap
등이 있다.
먼저 정렬 연관 컨테이너(ordered associative container)부터 살펴보자. std::set은 키에 연관된 값
이 없고, std::map은 키에 연관된 값이 있다. std::map은 키가 고유하지만 std::multimap은 키가
중복될 수 있다. 이러한 속성은 비정렬 연관 컨테이너(unordered associative container)에도 그대로
적용되며, 정렬 연관 컨테이너와 비슷한 점이 많다. 가장 큰 차이는 성능이다. 정렬 연관 컨테이
너의 접근 시간은 원소의 개수에 대해 로그 함수로 증가하지만, 비정렬 연관 컨테이너는 접근 시
간이 일정하다. 즉, 비정렬 연관 컨테이너의 접근 시간은 크기와 관계가 없다. std::map의 속성
은 std::vector와 비슷하다. 연관 컨테이너를 사용하는 경우의 95%는 키를 기준으로 정렬하는
std::map이 적합하다.
컨테이너 어댑터(container adapter)는 순차 컨테이너에 대한 간편한 인터페이스를 제공한다. C++
는 std::stack, std::deque, std::priority_queue를 제공한다.
반복자는 컨테이너와 알고리즘을 연결해준다. 반복자는 컨테이너에 의해 생성되며 범용 포인터로
구성된다. 반복자는 컨테이너에 대한 반복문을 임의의 위치를 기준으로 정방향 또는 역방향으로
진행하는 데 사용된다. 반복자의 종류는 컨테이너마다 다르다. 반복자 어댑터(iterator adapter)를
사용하면 스트림에 직접 접근할 수 있다.
STL은 알고리즘을 100개 이상 제공한다. 순차, 병렬, 병렬 및 벡터 중에서 원하는 실행 정책
(execution policy)에 따라 거의 모든 알고리즘을 구동할 수 있다. 알고리즘은 원소 또는 원소 범위
에 대해 작동한다. 범위(range)는 시작 지점을 가리키는 시작 반복자(begin iterator)와 끝 지점을 지
정하는 끝 반복자(end iterator)로 지정한다. 참고로 끝 반복자는 범위 끝에 해당하는 원소가 아니
라, 그다음 지점을 가리킨다는 점에 주의한다.
31
c++_06.indd 31 2021-11-19 오전 9:25:42