[STL] 10. unordered_map

[STL] 10. unordered_map

Tags
STL

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(log⁡n)O(\log n)O(logn)
순서 보장
순서 없음
오름차순 정렬
사용 사례
빠른 접근이 필요하고, 데이터의 순서가 중요하지 않은 경우
정렬이 필요하거나, 순서가 중요한 경우