sort 함수에 비교 함수를 넣는 부분은 C++에서 매우 강력한 기능 중 하나입니다. 이 기능을 사용하면 사용자가 원하는 기준에 따라 벡터나 배열을 정렬할 수 있습니다. 이를 위해 sort 함수는 세 번째 인자로 비교 함수를 받을 수 있습니다.
기본적인 sort 함수 사용:
sort(begin_iterator, end_iterator);
- begin_iterator: 정렬을 시작할 범위의 시작 지점입니다.
- end_iterator: 정렬을 종료할 범위의 끝 지점입니다.
- 이 기본 형태에서는 정렬 기준이 없는 경우 sort 함수는 기본적으로 오름차순 정렬(작은 값부터 큰 값으로 정렬)을 수행합니다.
sort 함수에 비교 함수(또는 람다 함수)를 전달하는 방법:
sort(begin_iterator, end_iterator, compare_function);
- compare_function: 두 개의 요소를 인자로 받아 비교 결과를 반환하는 함수입니다.
비교 함수의 역할:
비교 함수는 두 개의 요소를 비교하여 true 또는 false를 반환합니다.
- compare_function(a, b) 가 true를 반환: 이는 a가 b보다 앞에 있어야 한다는 것을 의미합니다.
- compare_function(a, b) 가 false를 반환: 이는 b가 a보다 앞에 있어야 한다는 것을 의미합니다.
예제: 기본적인 비교 함수
bool compare(int a, int b) {
return a < b; // a가 b보다 작다면 true를 반환 -> 오름차순 정렬
}
sort와 람다 함수:
C++11 이후, 람다 함수를 사용하여 간단하게 비교 기준을 정의할 수 있습니다.
예제 코드: 내림차순 정렬
sort(vec.begin(), vec.end(), [](int a, int b) {
return a > b; // a가 b보다 크다면 true -> 내림차순 정렬
});
람다 함수 사용 예제 설명:
sort(songs.begin(), songs.end(), [](const pair<int, int>& a, const pair<int, int>& b) {
if (a.first == b.first)
return a.second < b.second;
return a.first > b.first;
});
이 코드는 다음과 같이 동작합니다:
- const pair<int, int>& a, const pair<int, int>& b:
- a와 b는 songs 벡터의 두 요소입니다. 각 요소는 pair<int, int> 타입으로, 첫 번째 값(a.first)는 재생 횟수, 두 번째 값(a.second)는 노래의 고유 번호입니다.
- a.first == b.first:
- 먼저 두 노래의 재생 횟수가 같은지 확인합니다. 이 조건이 참이라면, a와 b의 second 값을 비교하여 고유 번호를 기준으로 오름차순 정렬을 수행합니다.
- return a.second < b.second;:
- 재생 횟수가 같을 경우, 고유 번호가 작은 것이 먼저 오도록 정렬합니다. a.second < b.second가 참이면 a가 b보다 앞에 배치됩니다.
- return a.first > b.first;:
- 재생 횟수가 다를 경우, 재생 횟수가 더 많은 노래가 앞에 오도록 정렬합니다. a.first > b.first가 참이면 a가 b보다 앞에 배치됩니다.
결론:
- 비교 함수를 사용하여 sort의 정렬 기준을 직접 정의할 수 있으며, 이를 통해 복잡한 정렬 기준을 간단하게 구현할 수 있습니다.
- 람다 함수는 인라인으로 비교 기준을 정의할 수 있어 코드가 간결해지며, 함수 포인터를 사용할 필요 없이 직접적으로 비교 기준을 전달할 수 있어 편리합니다.
이러한 방식을 사용하면, 다양한 기준에 맞춰 벡터나 배열을 정렬할 수 있습니다.
'개발 > C++' 카테고리의 다른 글
<algorithm> 메서드 (0) | 2024.08.28 |
---|---|
삼총사 (0) | 2024.08.25 |
[C++] 덱 std::deque (0) | 2024.08.25 |
[C++] 큐 std::queue (0) | 2024.08.25 |
[C++] priority_queue (우선순위 큐) (0) | 2024.08.15 |