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< : 구조체 내부 비교 연산자 오버로딩operator())외부에서 별도의 클래스나 구조체를 만들어 비교 기준을 정의하는 방식입니다.
class로 정의하고, public으로 구현하여 외부에서 접근할 수 있게 함operator()를 통해 비교 기준을 정의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;
operator<)구조체 내부에서 해당 타입의 기본 비교 기준을 정의하는 방식
const 선언 필수 (bool operator<(const T& other) const)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에서는 자동 정렬 기준으로 활용됩니다.
operator() vs operator< 차이점 정리| 구분 | operator() | operator< |
|---|---|---|
| 위치 | 구조체 외부의 비교 객체로 정의 | 구조체 내부에서 멤버 함수로 정의 |
| 목적 | 외부에서 비교 기준을 별도로 지정함 | 구조체 자체가 비교 기준을 내장함 |
| 사용 컨테이너 | priority_queue<T, vector<T>, Compare> | priority_queue<T, vector<T>, less<T>> 또는 priority_queue<T> (기본 비교 기준) |
| 특징 | 함수처럼 유연하게 호출 가능 | const 필요, 내부 정렬 자동 수행 |