[C++ STL] 비교 연산자 오버로딩 (Operator)

yeonjuLee·2025년 5월 2일

코딩테스트 대비

목록 보기
27/32

비교 연산자 오버로딩 (Operator) 구현

pair<int, int> 배열이나 int, string 같은 기본 자료형 배열을 정렬할 때는 bool cmp()와 같은 일반 비교 함수를 직접 구현해서 sort()에 넘겨줄 수 있습니다.

bool cmp(pair<int, int> a, pair<int, int> b) {
    return a.first > b.first;
}

sort(v.begin(), v.end(), cmp);

❗️하지만, 이런 일반 함수 방식이 동작하지 않는 경우가 있습니다.
바로 사용자 정의 데이터 타입인 struct로 정렬할 때입니다.
이 경우에는 비교 객체 클래스 또는 비교 연산자 오버로딩로 정의해야합니다.

STL 컨테이너에서 정렬 기준을 커스터마이징하려면 두 가지 방식으로 구현할 수 있습니다.

  • operator() : 함수 객체 방식 (Functor)
  • operator< : 구조체 내부 비교 연산자 오버로딩



1. 함수 객체 방식 (operator())

외부에서 별도의 클래스나 구조체를 만들어 비교 기준을 정의하는 방식입니다.

  • 클래스 또는 구조체 외부에서 정의
  • class로 정의하고, public으로 구현하여 외부에서 접근할 수 있게 함
  • operator()를 통해 비교 기준을 정의

예시: 절댓값 힙 구현 (백준 11286)

class compare {
public:
    bool operator()(int a, int b) {
        if (abs(a) != abs(b)) return abs(a) > abs(b);
        return a > b;
    }
};

priority_queue<int, vector<int>, compare> pq;

활용 방법

sort<T, Compare>: 벡터 등 컨테이너에서 정렬 기준을 설정합니다.

vector<T> v;
sort(v.begin(), v.end(), Compare());

set<T, Compare>: set에 삽입되는 원소들이 자동으로 정렬됩니다.

set<T, Compare> mySet;

map<T, Compare>: map에서 키 값에 대해 자동으로 정렬됩니다.

map<T, string, Compare> myMap;

priority_queue<T, vector<T>, Compare>: 우선순위 큐에서 우선순위가 높은 원소를 우선 처리합니다.

priority_queue<T, vector<T>, Compare> pq;



2. 구조체 내부 비교 연산자 오버로딩 (operator<)

구조체 내부에서 해당 타입의 기본 비교 기준을 정의하는 방식

  • 구조체 내부에서 정의
  • const 선언 필수 (bool operator<(const T& other) const)
  • 기본 컨테이너에서 자동 정렬 동작

예시: 강의실 배정 (백준 1374)

struct ise {
    int s, e, i;
    bool operator<(const ise& other) const {
        if (s != other.s) return s > other.s;
        if (e != other.e) return e > other.e;
        return i > other.i;
    }
};

priority_queue<ise> pq;

활용 방법

sort<T>: 벡터 등 컨테이너에서 정렬 기준을 설정합니다.

vector<T> v;
sort(v.begin(), v.end());

set<T>: set에 삽입되는 원소들이 자동으로 정렬됩니다.

set<T> mySet;

map<T, string>: map에서 키 값에 대해 자동으로 정렬됩니다.

map<T, string> myMap;

priority_queue<T>: 우선순위 큐에서 내부 정렬 기준을 자동으로 처리합니다.

priority_queue<T> pq;

참고로 C++에서는 <, ==, >, != 등 다양한 비교 연산자를 필요에 따라 오버로딩할 수 있습니다.
단, operator<만 정의해도 priority_queue, set, map에서는 자동 정렬 기준으로 활용됩니다.




3. operator() vs operator< 차이점 정리

구분operator()operator<
위치구조체 외부의 비교 객체로 정의구조체 내부에서 멤버 함수로 정의
목적외부에서 비교 기준을 별도로 지정함구조체 자체가 비교 기준을 내장함
사용 컨테이너priority_queue<T, vector<T>, Compare>priority_queue<T, vector<T>, less<T>> 또는 priority_queue<T> (기본 비교 기준)
특징함수처럼 유연하게 호출 가능const 필요, 내부 정렬 자동 수행

0개의 댓글