C++STL과 알고리즘

set과 unordered_set

중복 없는 집합 자료구조인 `set`과 `unordered_set`의 차이와 선택 기준을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

cpp
std::set<int> ordered{3, 1, 2};
std::unordered_set<int> fast{3, 1, 2};

설명

  • 두 컨테이너 모두 중복 없는 원소 집합을 표현하지만, 내부 구조와 성질이 다릅니다.
  • std::set은 보통 균형 이진 트리 기반이라 원소가 정렬된 순서로 유지되고, 탐색/삽입/삭제가 로그 시간 성능을 가집니다.
  • std::unordered_set은 해시 기반이라 평균적으로 더 빠른 탐색을 기대할 수 있지만, 원소 순서는 유지되지 않습니다.
  • 따라서 "정렬된 순회가 중요한가", "순서보다 빠른 membership test가 중요한가"를 보고 선택하는 것이 핵심입니다.
  • 같은 값이 두 번 들어가지 않는다는 공통점 때문에, 방문 체크, 사전 중복 제거, 태그 집합 표현에 자주 쓰입니다.

짧은 예제

cpp
#include <iostream>
#include <set>
#include <unordered_set>

int main() {
    std::set<int> ordered{3, 1, 2};
    std::unordered_set<int> fast{3, 1, 2};

    std::cout << ordered.count(2) << "\n";
    std::cout << fast.count(2) << "\n";
}

빠른 정리

항목설명
std::set정렬 상태를 유지하는 집합
std::unordered_set해시 기반 집합, 순서는 보장되지 않음
공통점중복 없는 원소만 저장
선택 기준정렬 필요 여부와 평균 탐색 성능
사용 예중복 제거, 방문 체크, membership test

주의할 점

원소를 삽입한 순서가 그대로 유지되길 기대하면 unordered_set은 맞지 않습니다. "순서"와 "빠른 조회" 중 무엇이 더 중요한지 먼저 정해야 합니다.