일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- 데이터베이스
- language
- BOJ
- 자료구조
- 네트워크
- db
- Computer Science
- Programmers
- 독서
- 법의학
- Database
- c++
- 알고리즘
- SW Expert Academy
- cs
- 감상문
- D2
- algogritim
- D3
- 프로그래머스
- algorithm
- 문제풀이
- network
- swea
- LeetCode
- 재테크/투자
- OS
- data structure
- 운영체제
- 백준
Archives
- Today
- Total
선택은 나의 것
[C++] std::map & std::unordered_map / stdext::hash_map 본문
☽ Computer Science/Language
[C++] std::map & std::unordered_map / stdext::hash_map
Algoribi 2021. 7. 18. 18:21- 이 문서는 마크다운으로 작성되었으며 github 스타일에 최적화되어있습니다. github 링크를 통한 열람을 권장합니다.
Map & UnorderedMap
std::map
Map이란 Key와 Value를 가진 집합으로, 중복을 허용하지 않는 컨테이너를 말한다.
- 레드블랙 트리(Red-Black Tree)를 기반으로 구현되어 있다. 따라서 모든 데이터는 정렬되어 저장되며, 정렬이 필요하지 않은 경우에도 자동으로 정렬되기 때문에 불필요하게 감수해야 하는 오버헤드가 발생했다.
- 입력되는 key 값의 분포가 고르지 못할 경우 balancing에 대한 비용이 계속 들어가기 때문에 성능이 저하된다. 동시에 self-balancing이 있기 때문에 최악의 경우에도 탐색속도는 O(logN)으로 보장된다.
std::unordered_map
c++ 11 이전엔 정렬이 필요하지 않은 경우에도 std::map을 사용하여 불필요한 오버헤드를 감수해야 했다. 그때 사용하던 것이 비표준 컨테이너인 stdext::hash_map이다. 이후 STL 표준 컨테이너에 hash_map과 거의 동일한 기능을 제공하는 unordered_map이 추가되었다.(TR1부터 추가되었지만, C++ 11 에서 최적화 작업이 이루어졌다고 한다.) MSDN의 hash_map 페이지에도 표준인 unordered_map 사용을 권장한다.
- 해시 테이블(hash_table)을 기반으로 구현되어 있다. 따라서 데이터를 자동으로 정렬하지 않는다.
- 충분한 hash_table의 크기만 주어진다면 데이터양이 많더라도 검색, 삽입, 삭제 연산의 성능을 보장할 수 있다.
결론
- 데이터가 많은 경우 unordered_map이 map보다 성능 면에서 유리하다.
- 문자열을 key로 사용하는 경우 문자열의 길이가 길어질수록 unordered_map의 성능이 map보다 떨어진다. (hashing)
- key 값의 분포가 고르지 못한 경우 map의 성능이 저하될 수 있다. (self-balancing)
'☽ Computer Science > Language' 카테고리의 다른 글
[C++] 템플릿(Template)과 STL (0) | 2021.07.11 |
---|---|
[C++] 바이트 패딩(Byte Padding) (0) | 2021.07.10 |
[C++] 동적 할당(Dynamic Allocation) / new & delete, malloc & free의 차이 (0) | 2021.07.06 |
[C++] 포인터(Pointer)와 레퍼런스(Reference)의 차이 (0) | 2021.06.27 |
Comments