unordered_map
을 사용했는데 시간초과로 틀렸다. 이를 해결하기 위해 map
으로 자료구조를 바꾸어 시도해보니 바로 성공하였다.연관 컨테이너
사이의 차이를 정확히 모른다는 것을 알고, 조사해보고자 이 곳에 정리한다.key
와 value
를 관계지어 묶어서 저장하는 컨테이너이다. key
를 통해 요소에 빠른 접근은 가능하지만 자체적인 기준으로 요소를 정렬하기 때문에 삽입되는 요소의 위치를 지정하거나 알 수 없다.int
값 Index
나 반복자(Iterator)
를 사용한 접근이 불가하다는 것이다.key
와 value
를 쌍으로 가지는 연관 컨테이너이다. key
값에 따라 오름차순으로 정렬된다.key
와 value
를 대응하여 key
를 인덱스처럼 사용해 value
에 접근할 수 있다.key
의 중복을 허용하지 않는다.map
과 거의 같지만, key
의 중복을 허용한다. 즉, 하나의 key
가 여러 개의 value
와 연결될 수 있다.#include <map>
map<key type, value type> 맵 이름;
multimap<key type, value type> 멀티맵 이름;
key
만 갖는 컨테이너이다. key
가 곧 저장하는 값이다.map
과 같이 Red-Black Tree로 구현된다고 한다.key
값에 따라 오름차순으로 정렬된 위치에 요소를 삽입하여 검색 속도가 매우 빠르다.key
의 중복을 허용하지 않는다.set
과 거의 같지만 key
의 중복을 허용한다. #include <set>
set<타입> 셋이름(생성자 인수);
multiset<타입> 멀티셋이름(생성자 인수);
map, set
과 같지만, 구현되는 구조가 다르다.map
과 set
은 트리로 구현되어 요소를 정렬하지만,unordered_map
과 unordered_set
은 key
를 해시(Hash) 함수로 무작위의 인덱스로 변환해 요소를 해시 테이블에 균등 분배해 저장한다.unordered_map
과 unordered_set
의 사용은 다음과 같은 경우에 바람직하다.
- 많은 데이터를 저장해야 하는 반면 검색 속도는 빨라야 하는 경우
- 빈번하게 데이터의 삽입, 삭제가 일어나지 않는 경우
key
중복을 허용하지 않는다.key
의 중복을 허용한다.map
과 unordered_map
을 비교했을 때map
이 유리하고 많으면 unordered_map
이 유리하다는 것을 알았다.map
은 데이터 양이 많으면 인덱스가 널뛰기 때문에 캐시 미스가 발생하기 쉽고,unordered_map
은 데이터 양이 적으면 캐시 미스가 발생하기 쉽다는 지역참조성에 따른 결론이다.unordered_map
은 해시 함수의 성능이 자료 구조 자체의 성능에 크게 관여한다고 한다.map
이 탐색 성능에 있어서 우위를 점한다고 한다.map
이 Red-Black Tree로 구현되어 있어 문자열 비교를 더 적게 필요로 하기 때문이다.문자열의 길이가 길고 데이터의 양이 많지 않은 경우는
map
이unordered_map
보다 탐색에 유리하다.
key
로 사용되는 데이터 또한 최대 20의 길이를 가지는 문자열이었기에, unordered_map
에 비해 map
을 사용하는 것이 훨씬 적절한 구현으로 보인다.