정렬용 비교 함수 객체?

정렬용 비교 함수 객체는 함수와 비슷하게 작동하지만, 객체의 형태로 구현된 코드

비교 조건을 캡슐화하기 위해 클래스나 구조체로 구현하며, 이를 std::sort 함수에 전달하여 정렬 기준으로 사용할수 있음.

C++에서는 정렬 기준을 정의하기 위해 다음 두 가지를 사용할 수 있습니다:

  1. 람다 함수: 익명 함수 형태로 조건을 간단히 정의.
  2. 비교 함수 객체: 비교 기준을 객체로 캡슐화하여 사용.

이 코드의 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가 먼저
    }
};

 

주요 구성 요소

  1. 멤버 변수 val: 정렬 기준이 되는 값을 저장
  2. 생성자 Compare(int v): val을 초기화. 즉, 어떤 값을 기준으로 정렬할지 설정
  3. 연산자 오버로딩 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}


이 코드의 장점

  1. 재사용성:
  • Compare 객체는 다양한 상황에서 반복 사용이 가능.
  • 특정 기준 값(val)만 바꾸면 다른 조건으로 정렬 가능.
  1. 가독성:
  • 정렬 기준이 명확히 캡슐화되어 코드의 의도를 쉽게 파악가능.
  1. 람다 함수 대체:
  • 람다 함수를 사용할 수 없는 상황에서도 객체를 통해 정렬 기준을 정의가능.

간단 정리

  • 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

+ Recent posts