본문 바로가기
언어/C++

(C++)연관컨테이너(set, multiset, map, multimap)

by 흥부와놀자 2020. 9. 22.

연관 컨테이너와 시퀀스 컨테이너(vector, deque, list)의 차이

 

각 원소를 삽입할때 연관 컨테이너는 자동으로 함수객체(디펄트로 less객체)에 따라 정렬되며, 또한 시퀀스컨테이너는 배열, 리스트로 구현되는것과 다르게 내부 데이터가 Balaced Tree로 구현된다.  push_back(), push_front(), front(), back()같은 함수가 존재하지 않는다.

 

그렇기에 접근에 유리한 vector와 deque / 삽입, 삭제에 유리한 List 에 비해 연관 컨테이너는 탐색에 Log 시간대를 가지며 유리하다.

또한 연관컨테이너는 4개 모두 같은 인터페이스를 가진다.

 

multi?

multi가 붙은 컨테이너는 키값의 중복을 허용한다. equalrange(), lower_bound(), upper_bound() 함수를 통해 중복되는 데이터의 범위를 가져올 수 있다. 

 

set

set은 키값과 value가 하나로 통일된 컨테이너이다.  

 

multiset 

set에서 키값의 중복이 허용된 set이다.

 

map

키값과 value가 따로 분리된 컨테이너로써 map객체[key값] = value값; 식으로 손쉽게 원소를 집어넣을 수 있다. 만약 []안에 들어간 key값이 없다면 새로 만들어서 value값을 집어넣는다.

 

multimap

map에서 키값의 중복을 허용한 컨테이너로써 map과같이 []을 통한 원소 삽입은 불가하다.

 

map vs unordered_map

map과 다르게 unordered_map이 존재하는데 map이 트리 구조로 구현되어 순서가 필요한 구조나 반복자를 돌때 빠르지만 컨테이너의 크기가 커질수록 Insert, delete,탐색 시 시간이 점점 오래 걸린다.

 

하지만 unordered_map은 내부가 해쉬맵으로 구현되어 있다. 그렇기에 탐색 시 map은 O(logn)에 비해 unordered_map은 O(1)의 시간대를 가진다. 

 

기본적인 STL의 컨테이너들을 살펴봤는데, 가장 중요한건 이들을 적재적소에 사용 함으로써 실제 수행속도를 올려야 된다는것이다.  

 

앞으로 프로젝트 시 배운 특징들을 기억하여 잘 써먹어 봐야겠다. 

'언어 > C++' 카테고리의 다른 글

(C++)참조자 const  (0) 2020.10.06
(C++)List  (0) 2020.09.16
(C++)Vector / Deque  (0) 2020.09.14
(C++)STL  (0) 2020.09.14
(C++) 템플릿  (0) 2020.09.14