TIL

[cpp] priority_queue Custom Comparator

hio9_9 2022. 11. 21. 13:55

[priority_queue]

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;
// priority_queue 정의

priority_queue<int> basic_Q;							// 오름차순, default
priority_queue<int, vector<int>, less<int>> asce_Q;		// 오름차순
priority_queue<int, vector<int>, greater<int>> desc_Q;	// 내림차순

[comparator 커스텀]

 

1. 함수 구현

typedef pair<int, int> pairInt;

bool my_cmp(pairInt &a, pairInt &b) {
    return a.first < b.first;    // less, 오름차순
}

int main() {
    // 1. 함수 포인터 이용
    priority_queue<pairInt, vector<pairInt>, bool(*)(pairInt, pairInt)> PQ_1(my_cmp);
    // 2. decltype 이용
    priority_queue<pairInt, vector<pairInt>, decltype(&my_cmp)> PQ_2(my_cmp);
}

 

2. 람다식 활용

typedef pair<int, int> pairInt;

int main() {
    auto my_cmp = [](pairInt &a, pairInt &b) -> bool {
		return a.first < b.first;    // less, 오름차순
	};

    // 1. 함수 포인터 이용
    priority_queue<pairInt, vector<pairInt>, bool(*)(pairInt, pairInt)> PQ_1(my_cmp);
    // 2. decltype 이용
    priority_queue<pairInt, vector<pairInt>, decltype(&my_cmp)> PQ_2(my_cmp);
}

 

3. 구조체 활용1, cmp 구조체

typedef pair<int, int> pairInt;

struct my_cmp {
    bool operator() (pairInt &a, pairInt &b) {
        return a.first < b.first;    // less, 오름차순
    }
};

int main() {
    priority_queue<pairInt, vector<pairInt>, my_cmp> PQ;
}

 

4. 구조체 활용2, 구조체 내부 연산자 오버로딩

struct my_type {
    int first, second;
    my_type(int _f, int _s) : first(_f), second(_s) {}
    bool operator< (const my_type &b) const {
        return this->first < b.first;    // less, 오름차순
    }
};

int main() {
    priority_queue<my_type> PQ;
}