정렬용 비교 함수 객체?
정렬용 비교 함수 객체는 함수와 비슷하게 작동하지만, 객체의 형태로 구현된 코드
비교 조건을 캡슐화하기 위해 클래스나 구조체로 구현하며, 이를 std::sort 함수에 전달하여 정렬 기준으로 사용할수 있음.
C++에서는 정렬 기준을 정의하기 위해 다음 두 가지를 사용할 수 있습니다:
- 람다 함수: 익명 함수 형태로 조건을 간단히 정의.
- 비교 함수 객체: 비교 기준을 객체로 캡슐화하여 사용.
이 코드의 Compare 객체
struct Compare {
int val; // 정렬 기준이 되는 값
Compare(int v) : val(v) {} // 생성자에서 기준값 초기화
bool operator()(int a, int b) { // 비교 연산 정의
// a와 b를 val 기준으로 비교
if (abs(val - a) < abs(val - b)) return true; // 절대값 차이가 작으면 a가 먼저
if (abs(val - a) == abs(val - b)) return a < b; // 차이가 같으면 작은 값이 먼저
return false; // 그 외에는 b가 먼저
}
};
주요 구성 요소
- 멤버 변수 val: 정렬 기준이 되는 값을 저장
- 생성자 Compare(int v): val을 초기화. 즉, 어떤 값을 기준으로 정렬할지 설정
- 연산자 오버로딩 bool operator()(int a, int b):
std::sort에서 두 값을 비교할 때 호출되는 함수, 정렬 기준 정의
사용법
1. 객체 생성
Compare comp(val); val은 정렬 기준 값으로, 생성자에 전달됨
2. std::sort에 전달 sort(v.begin(), v.end(), Compare(val));
- 이 코드에서 Compare(val) 객체를 생성하여 std::sort에 전달
- std::sort는 벡터의 각 요소를 두 개씩 비교할 때마다 operator()를 호출하여 정렬 기준에 따라 요소를 정렬
작동 과정
예를 들어, 벡터 v = {9, 5, 15, 20}이고 val = 10이라고 가정했을 때,
std::sort는 벡터의 요소를 비교하며 정렬한다.
각 비교는 Compare(val) 객체의 operator()(a, b)를 호출하여 수행.
예:
첫 번째 비교: a = 9, b = 5 // abs(10 - 9) = 1, abs(10 - 5) = 5 → 9가 5보다 앞에 위치.
두 번째 비교: a = 15, b = 9 // abs(10 - 15) = 5, abs(10 - 9) = 1 → 9가 15보다 앞에 위치.
최종 정렬 결과: 기준 val = 10에 따라 정렬된 벡터는 {9, 15, 5, 20}
이 코드의 장점
- 재사용성:
- Compare 객체는 다양한 상황에서 반복 사용이 가능.
- 특정 기준 값(val)만 바꾸면 다른 조건으로 정렬 가능.
- 가독성:
- 정렬 기준이 명확히 캡슐화되어 코드의 의도를 쉽게 파악가능.
- 람다 함수 대체:
- 람다 함수를 사용할 수 없는 상황에서도 객체를 통해 정렬 기준을 정의가능.
간단 정리
- Compare 객체는 정렬 기준을 캡슐화한 도구
- std::sort 함수는 요소를 비교할 때마다 Compare 객체의 operator()를 호출하여 정렬
- 객체를 사용함으로써 코드의 재사용성과 가독성을 높일 수 있다.
'C++' 카테고리의 다른 글
| 데이터 파싱 (0) | 2025.06.17 |
|---|---|
| 커스텀 변수 연산자 오버로딩 (0) | 2025.06.17 |
| 포인터 (나중에 다시 또 공부하기;) (1) | 2025.06.17 |
| 배열 (0) | 2025.06.17 |
| 제어문, 반복문 (0) | 2025.06.17 |