1. 개요
std::unordered_set은 해시 기반의 집합 컨테이너로, 고유한 값을 저장하며, 원소의 순서는 정의되지 않습니다. <unordered_set> 헤더에 정의되어 있습니다.
#include <unordered_set>
std::unordered_set<int> uset = {10, 20, 30};
2. 주요 특징
- 고유한 값만 저장
- 정렬되지 않음 (삽입 순서와 무관)
- 평균적으로 매우 빠른 검색, 삽입, 삭제 (O(1))
- 내부적으로 해시 테이블 사용
- 반복 순서는 일정하지 않음
3. 주요 멤버 함수
🔹 크기 관련
| 함수 |
설명 |
empty() |
비었는지 확인 |
size() |
요소 수 반환 |
clear() |
모든 요소 삭제 |
🔹 삽입/삭제
| 함수 |
설명 |
insert(val) |
요소 삽입 |
emplace(args...) |
직접 생성하여 삽입 |
erase(val) |
값 제거 |
erase(iterator) |
반복자로 제거 |
erase(first, last) |
범위 삭제 |
swap(other) |
다른 컨테이너와 교환 |
🔹 탐색
| 함수 |
설명 |
find(val) |
값 탐색, 반복자 반환 |
count(val) |
해당 값이 존재하는지 확인 (0 또는 1) |
4. 반복자 관련
| 함수 |
설명 |
begin() / end() |
반복자 |
cbegin() / cend() |
const 반복자 |
5. 해시 및 버킷 관련
| 함수 |
설명 |
bucket_count() |
버킷 수 |
bucket_size(n) |
n번째 버킷의 크기 |
load_factor() |
현재 load factor 확인 |
rehash(n) |
최소 n개의 버킷 확보 |
reserve(n) |
n개의 원소를 저장할 공간 확보 |
6. 예제 코드
#include <iostream>
#include <unordered_set>
using namespace std;
int main() {
unordered_set<int> us = {1, 2, 3};
us.insert(4);
us.erase(2);
for (int val : us) {
cout << val << " ";
}
cout << endl;
if (us.find(3) != us.end()) {
cout << "3 is found" << endl;
}
return 0;
}
7. std::set vs std::unordered_set
| 항목 |
std::set |
std::unordered_set |
| 내부 구조 |
트리 (Red-Black Tree) |
해시 테이블 |
| 정렬 여부 |
자동 정렬 |
없음 |
| 접근 속도 |
O(log N) |
평균 O(1) |
| 순서 보장 |
있음 |
없음 |
| 커스텀 정렬 |
가능 |
불가 (해시 기준) |
8. 주의사항
- 키 값의 해시 함수와 동등 비교 연산자 필요
- 반복 순서는 삽입/삭제에 따라 변할 수 있음
- 충돌이 많아지면 성능 저하 가능 (load factor 관리)
Comments