[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;
}
'프로그래밍 언어 > C++\C' 카테고리의 다른 글
| [C++] 맵과 우선 순위 큐에서 정렬 기준 재정의하기 (0) | 2024.02.27 |
|---|---|
| [C++] 잡기술) 맵의 모든 요소를 벡터로 옮기기 (1) | 2023.12.07 |
| [C++] 정렬 기준 설정해서 정렬하기, map, prioiry_queue에도 사용 가능 (1) | 2023.12.07 |
| [C++] Map vs Set vs Priority Queue (0) | 2023.12.07 |
| [C++] 이분 탐색 메서드 - binary_search, lower_bound, upper_bound (1) | 2023.09.07 |