[C++] STL에서의 unordered_map사용법과 map과의 차이점, unordered_set 사용법
2023. 8. 21. 16:47ㆍ프로그래밍 언어/C++\C
해시테이블이란?
C++에서 표준 라이브러리로 해시테이블을 지원한다. 해시 테이블은 key-value 형태의 데이터를 빠른 시간복잡도를 보장하는 삽입, 삭제 및 검색 작업을 위한 자료 구조이다. 해시 함수를 사용하여 배열의 인덱스에 키를 매핑하여 작동한다. 배열의 각 인덱스는 동일한 키가 한 인덱스에 매핑되는 충돌을 해결하기 위한 메커니즘을 보유한다.
unordered_map 선언과 주요 메서드
C++에서는 unordered_map으로 이를 지원하는데, 평균적으로 상수 시간에 원소를 삽입/삭제/검색이 가능하다. 보통 키를 기반으로 원소에 대한 빠른 탐색이 필요한 경우 사용한다.
key(string) : value(int) 형태의 데이터를 사용하는 해시테이블을 만들어보자!
unordered_map<string, int> table;
간단하게 주요 메서드들을 보고, 예제로 다시 보자.
table[key] = value : key를 해싱하여 table에 삽입한다.
table.erase(key) : table에서 key값을 삭제한다.
table.find(key) : table에서 key값을 찾으면 해당 원소의 이터레이터를 반환하고, 찾지 못하면 table.end()를 반환한다.
table.end() : table의 끝을 나타내는 이터레이터를 반환한다. 이 이터레이터는 유효하지 않은 위치를 나타낸다.
key, value 모두 pair 형태로 여러 쌍을 저장할 수 있다.
원소의 삽입과 삭제도 간단하다.
table["one"] = 1;
table["two"] = 2;
table.erase("two");
table["one"]을 실행하면서 자동으로 one에 해싱이 이루어지면서 삽입된다.
원소의 탐색과 테이블 순회를 보자.
int main(){
cout << "Value of key 'two' : "<< table["two"];
if(table.find("four") != table.end()) cout << "'four' does not exist.";
else cout << "'four' exists.";
for(auto pair : table)
cout << pair.first << " : " << pair.second << "\n";
unordered_map<string, int>::iterator it;
for(it = table.begin(); it != table.end(); it++)
cout << it->first << " : " << it->second << "\n";
}
unordered_map과 map의 차이점
1. unordered_map
- 해시 테이블로 구현되어 평균적으로 빠른 삽입, 삭제 및 검색을 제공한다.
- 원소의 순서가 삽입 순서와는 무관하다.
- 원소에 빠른 접근이 많이 일어나고 원소에 대한 정렬이 필요하지 않을 때 사용한다.
- 중복 키를 허용하지 않는다.
2. map
- 레드-블랙 트리같은 균형 이진 검색 트리로 구현되어 원소가 키에 따라 정렬된다.
- 원소에 대한 빠른 접근과 정렬된 원소가 필요할 때 사용한다.
- 중복 키를 허용하지 않는다.
만약 중복 키가 필요하다면 multimap이나 unordered_multimap을 사용하면 된다.
unordered_set
unordered_set은 해시테이블 기반의 자료구조이다. unordered_map과 거의 똑같은 역할을 하지만 key-value 형태의 데이터가 아닌, key만 가지고 데이터를 관리할 때 사용한다.
'프로그래밍 언어 > C++\C' 카테고리의 다른 글
[C++] 문자열을 다룰 때 조심해야하는 이유 - 문자열 복사 (0) | 2023.08.21 |
---|---|
[C++] 문자열의 기초부터 꼭 알아야 할 메서드들까지 (0) | 2023.08.21 |
[C++] Stack, Queue, 우선순위 큐에 구조체 넣는 법 (0) | 2023.08.16 |
[C++] Map, Set 사용하고 구조체까지 넣어보기 (0) | 2023.08.09 |
[C++] Vector, Deque, List는 언제 사용해야할까? (0) | 2023.08.02 |