본문 바로가기
개발/C++

[C++] sort

by WaDDak 2024. 8. 15.

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;
});

이 코드는 다음과 같이 동작합니다:

  1. const pair<int, int>& a, const pair<int, int>& b:
    • a와 b는 songs 벡터의 두 요소입니다. 각 요소는 pair<int, int> 타입으로, 첫 번째 값(a.first)는 재생 횟수, 두 번째 값(a.second)는 노래의 고유 번호입니다.
  2. a.first == b.first:
    • 먼저 두 노래의 재생 횟수가 같은지 확인합니다. 이 조건이 참이라면, a와 b의 second 값을 비교하여 고유 번호를 기준으로 오름차순 정렬을 수행합니다.
  3. return a.second < b.second;:
    • 재생 횟수가 같을 경우, 고유 번호가 작은 것이 먼저 오도록 정렬합니다. a.second < b.second가 참이면 a가 b보다 앞에 배치됩니다.
  4. 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