[C++] 정렬 기준 설정해서 정렬하기, map, prioiry_queue에도 사용 가능

2023. 12. 7. 16:13프로그래밍 언어/C++\C

기본적인 방법은 cmp함수를 정의해서 거기에 정렬 기준을 구성하고, sort 함수나 map, priority_queue에 인자로 넣어주면 된다. 맵과 셋에서의 사용법은 똑같다.

내림차순 cmp 함수를 정의하려면 어떻게 할까?

return a > b;

이것만 기억하면 된다. cmp 함수로 앞에 들어온 인자가 더 큰 것을 리턴하게 하면, 더 큰 것을 앞으로 두고 정렬하겠다는 뜻이다. 실제 사용 예시들을 보자.

#include <iostream>
#include <map>

struct CustomCompare {
    bool operator()(int a, int b) const {
        return a > b; // 내림차순 정렬
    }
};

int main() {
    std::map<int, std::string, CustomCompare> myMap;
    myMap[3] = "Three";
    myMap[1] = "One";
    myMap[4] = "Four";
    myMap[2] = "Two";

    // 출력: {4, "Four"}, {3, "Three"}, {2, "Two"}, {1, "One"}
    for (const auto& pair : myMap) {
        std::cout << "{" << pair.first << ", \"" << pair.second << "\"} ";
    }

    return 0;
}

 

기본적으로 위의 방식처럼 사용자 정의 비교함수를 정의하고 인자로 사용한다. 나머지 자료구조도 보자.

#include <iostream>
#include <queue>

struct CustomCompare {
    bool operator()(int a, int b) const {
        return a > b; // 내림차순 정렬
    }
};

int main() {
    std::priority_queue<int, std::vector<int>, CustomCompare> myPriorityQueue;

    myPriorityQueue.push(3);
    myPriorityQueue.push(1);
    myPriorityQueue.push(4);
    myPriorityQueue.push(2);

    // 출력: 4 3 2 1
    while (!myPriorityQueue.empty()) {
        std::cout << myPriorityQueue.top() << " ";
        myPriorityQueue.pop();
    }

    return 0;
}
#include <iostream>
#include <algorithm>
#include <vector>

struct CustomCompare {
    bool operator()(int a, int b) const {
        return a > b; // 내림차순 정렬
    }
};

int main() {
    std::vector<int> myVector = {3, 1, 4, 2};

    // 벡터를 내림차순으로 정렬
    std::sort(myVector.begin(), myVector.end(), CustomCompare());

    // 출력: 4 3 2 1
    for (int value : myVector) {
        std::cout << value << " ";
    }

    return 0;
}