[C++] C++에서의 비교 함수 설정법과 람다 표현식

2025. 4. 9. 15:21프로그래밍 언어/C++\C

C++의 sort, stable_sort, set, map는 비교 함수를 설정할 수 있다. 정렬 기준을 설정하는 것이다.

참고로 stable_sort는 동일한 값을 가진 원소들의 상대적 순서(삽입 순서)가 정렬 후에도 보존되는 정렬 알고리즘이다.

 

C++에서 비교 함수가 true를 반환하면  첫 번째 인자가 더 앞에 오게 한다. 즉, comp(a, b)가 true를 반환하면 a가 앞에 오는 것이다. 따라서 a>b를 비교 함수로 설정하면 a가 더 클 때 true이고 더 큰게 앞으로 오므로 내림차순 정렬이 된다.

 

이 비교 함수는 람다 표현식으로 익명 함수를 생성해 편리하게 설정할 수 있다. 람다 표현식의 기본 문법은 다음과 같다.

[캡처](매개변수) -> 반환타입 { 함수 본문 }

 

  • 캡처 클로저 [ ]: 외부 변수를 람다 내부로 가져오는 방법을 지정한다.
  • 매개변수 목록 ( ): 일반 함수의 매개변수와 동일
  • 반환 타입 -> 타입: 생략 가능, 컴파일러가 추론 가능
  • 함수 본문 { }: 실행할 코드

 

예시로 보자.

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

struct Person {
    std::string name;
    int age;
    float height;
};

int main() {
    std::vector<int> numbers = {5, 2, 8, 1, 9};
    
    // 1. 기본 내림차순 정렬
    std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
        return a > b;  // 내림차순: 큰 값이 앞에 오도록
    });
    
    // 2. 짝수가 홀수보다 앞에 오도록 정렬, 같은 종류 내에서는 오름차순
    std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
        if (a % 2 == b % 2) {  // 둘 다 짝수이거나 둘 다 홀수인 경우
            return a < b;      // 오름차순 정렬
        }
        return a % 2 == 0;     // a가 짝수면 true (a가 앞에 옴)
    });
    
    // 3. 외부 변수 캡처하여 정렬 (특정 값과의 거리 기준)
    int pivot = 5;
    std::sort(numbers.begin(), numbers.end(), [pivot](int a, int b) {
        return std::abs(a - pivot) < std::abs(b - pivot);  // pivot과 가까운 값이 앞에 오도록
    });
    
    // 4. 구조체 정렬
    std::vector<Person> people = {
        {"Alice", 25, 165.5},
        {"Bob", 30, 180.0},
        {"Charlie", 25, 175.0}
    };
    
    // 나이 기준 오름차순, 같은 나이면 키 기준 내림차순
    std::sort(people.begin(), people.end(), [](const Person& a, const Person& b) {
        if (a.age == b.age) {
            return a.height > b.height;  // 키는 내림차순
        }
        return a.age < b.age;  // 나이는 오름차순
    });
    
    return 0;
}