Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ set(집합)에 사용자 정의 데이터 타입 적용하는 방법

C++의 set(집합)은 값을 저장하는 대표적인 연관 컨테이너입니다. set의 가장 큰 특징은 다음 두 가지입니다.

  • 중복을 허용하지 않음 — 모든 요소는 서로 다른 고유한 값만 가집니다.
  • 자동 정렬 — 요소들은 항상 오름차순으로 저장됩니다.

일반적으로 set에는 int, string 같은 기본 타입을 사용하지만, C++에서는 사용자가 직접 정의한 데이터 타입(struct, class 등)도 set의 요소로 사용할 수 있습니다. 이때 비교 연산자를 직접 정의해 주어야 합니다.

예를 들어, 임의의 순서로 입력된 중복 값을 포함한 데이터를 set에 넣으면 자동으로 중복이 제거되고 정렬된 결과를 얻을 수 있습니다.

Input  : 124689781230
Output : 1230467889

동작 원리

set에 입력되는 데이터는 어떤 순서로 들어오든 상관없으며, 중복된 값이 포함될 수도 있습니다. 하지만 set은 내부적으로 정렬된 상태로 고유한 값만 저장합니다. 사용자 정의 타입을 사용할 경우, set이 요소 간의 순서를 판단할 수 있도록 operator<(작음 비교 연산자)를 반드시 오버로딩해야 합니다.

예제 코드

아래 예제에서는 id 멤버 변수를 가진 Test 구조체를 정의하고, operator<를 오버로딩하여 set에 삽입합니다. 중복된 값(t1과 t5)은 하나만 저장되고, id 기준으로 오름차순 정렬되어 출력됩니다.

#include<bits/stdc++.h>
using namespace std;
struct Test {
    int id;
    bool operator < (const Test& t) const {
        return (this->id < t.id);
    }
};
int main() {
    Test t1 = { 12 }, t2 = { 45 }, t3 = { 32 }, t4 = { 78 }, t5 = {12}, t6 = {8};
    set<struct Test> s;
    s.insert(t1);
    s.insert(t2);
    s.insert(t3);
    s.insert(t4);
    s.insert(t5);
    s.insert(t6);
    set<struct Test>::iterator it;
    for (it = s.begin(); it != s.end(); it++) {
        cout << (*it).id << " ";
    }
    return 0;
}

실행 결과

8 12 32 45 78

핵심 포인트 정리

  • 사용자 정의 타입을 set에 저장하려면 비교 연산자(operator<) 오버로딩이 필수입니다.
  • 중복으로 판단되는 요소(여기서는 id가 같은 t1과 t5)는 한 번만 저장됩니다.
  • 결과는 항상 정의한 비교 기준(id)에 따라 오름차순으로 출력됩니다.