unordered_map
개념
- 해시 테이블을 기반으로 한 키-값 쌍을 저장하는 컨테이너이다.
- 빠른 검색 속도로, 일반적인 경우 삽입, 삭제, 탐색에 O(1)의 시간복잡도를 가진다.
- 내부적으로 해싱 함수인 std::hash를 사용한다.
- 해시 테이블을 사용해 데이터를 저장하므로 데이터의 순서는 보장되지 않는다.
- 충돌 방지 기법으로 체이닝 방식을 사용한다.
생성
unordered_map<string, int> umap;
멤버 함수
자주 사용되는 멤버 함수를 정리했다. 자세한 내용은 아래 사이트에서 볼 수 있다.
삽입
// 위치에 요소를 삽입 auto result = umap.insert({ "name", 5 }); // 요소를 생성 후 삽입, 요소 복사나 이동과정 줄어들음 auto result = umap.emplace( "name", 5 ); // 삽입 결과 리턴 result.first // 첫 번째는 삽입된 요소 또는 이미 존재하는 요소에 대한 이터레이터. result.second // 두 번째는 삽입이 성공했는지 여부를 나타내는 bool 값
특징 | emplace() | insert() |
복사/이동 여부 | 객체를 직접 생성 (복사/이동 없음) | 객체가 이미 생성되어 있고, 복사됨 |
효율성 | 복사와 이동이 없으므로 더 효율적 | 생성된 객체를 삽입해야 하므로 비효율적일 수 있음 |
사용 방식 | 생성자 인자를 전달하여 객체를 삽입 | 이미 존재하는 객체를 전달하여 삽입 |
삭제
unordered_map<string, int> umap = {{ "apple", 1 }, { "banana", 2 }, { "orange", 3 }}; // 키를 이용해 삭제 umap.erase("apple"); // apple만 삭제 // 이터레이터를 이용해 삭제 umap.erase(it1, it2, ...); // 전부 삭제, 컨테이너는 유효함 umap.clear();
탐색
// 연산자 []를 사용하여 접근, 키가 없을 경우 요소 삽입 umap.insert({"apple", 1}); cout << operator["apple"]; // 1 // at()함수를 사용하여 접근, 키가 없을 경우 예외를 발생 umap.insert({"apple", 1}); try { cout << umap.at("banana"); } catch (out_of_range& e) { cerr << e.what(); } // 특정 키를 가진 원소를 찾아 이터레이터를 반환, 없으면 end()반환 auto it = umap.find("apple");
unordered_map vs map
특징 | unordered_map | map |
기본 자료구조 | 해시 테이블(Hash Table) | 레드-블랙 트리(Red-Black Tree, 균형 이진 탐색 트리) |
데이터 정렬 | 데이터의 순서를 보장하지 않음 | 키를 기준으로 오름차순 정렬 |
삽입/삭제/검색 시간 복잡도 | 평균: O(1)O(1)O(1), 최악: O(n)O(n)O(n) | 항상 O(logn)O(\log n)O(logn) |
순서 보장 | 순서 없음 | 오름차순 정렬 |
사용 사례 | 빠른 접근이 필요하고, 데이터의 순서가 중요하지 않은 경우 | 정렬이 필요하거나, 순서가 중요한 경우 |