#include <queue> // priority_queue가 아닌 queue헤더에 있음
void main()
{
std::priority_queue<int> q;
}
1. priority_queue의 개념
https://smallpants.tistory.com/188
2. priority_queue의 함수 원형
template <
class T,
class Container = vector<T>,
class Compare = less<typename Container::value_type>
>
class priority_queue;
vector 기반으로 만들어진 컨테이너 어댑터
기본값은 less로 큰 값이 우선적으로 나오게 되어있지만 작은 값이 우선적으로 나오게 greater로 쓰고 싶다면 priority_queue <int, vector<int>, greater<int>> pq;
처럼 생성 후 사용
3. priority_queue의 멤버 변수들
- value_type : The first template parameter (T), Type of the elements
- container_type : The second template parameter (Container), Type of the underlying container
- reference : container_type::reference, usually value_type&
- const_reference : container_type::const_reference, usually const value_type&
- size_type : an unsigned integral type, usually the same as size_t
4. priority_queue의 멤버 함수들
- 생성자 : Construct priority_queue (public member function)
- empty : Test whether container is empty (public member function)
- size : Return size (public member function)
- top : Access top element (public member function) // 가장 높은 숫자이자 첫 칸에 있는 값
- push : Insert element (public member function)
- pop : Remove next element (public member function)
- emplace : Construct and insert element (public member function)
- swap : Swap contents (public member function)
overload된 Non-멤버 함수들
- swap (queue) : Exchange contents of queues (public member function)
특수화된 Non-멤버 클래스
- uses_allocator<queue>
: Uses allocator for queue (class template)
5. priority_queue 사용 팁들
1) 값을 넣는순서에 상관없이 가장 큰 값이 앞으로 간다.
priority_queue<int> pq;
pq.push(5);
pq.push(3);
pq.push(4);
pq.push(1);
pq.push(2);
while(!pq.empty()) {
cout << pq.top();
pq.pop();
}
// 출력결과 : 54321
2) push와 emplace의 차이점
push는 오브젝트를 생성 후 queue에 값을 복사해서 넣어주는 방식으로 불필요한 복사가 발생 할 수 있음
emplace는 오브젝트를 생성하지 않고 바로 값을 넣어주는 방식
다만 개인적인 생각인데 현시점에서는 컴파일러가 알아서 복사생략 해주지 않을까 싶어서 상관없지 않을까 싶기도 함
3) 오름차순 priority_queue 만들기
큰 값부터 나오는 것이 아니라 작은 값부터 나오게 만들 고 싶다면priority_queue <int, vector<int>, greater<int> > pq;
처럼 생성 후 사용하거나
그냥 priority_queue<int> pq;
로 선언하고 pq.push(-value);
로 값을 -로 넣어버리고int cost = -pq.top();
로 값을 빼올때 -를 또 붙여버리는 방법도 있음
4) 정렬 우선순위 지정하는 법
람다함수가 template 안이라서 오류가 나는듯함
그래서 함수객체를 만들어서 사용
struct cmp
{
bool operator()(int n1, int n2)
{
if (abs(n1) > abs(n2)) return true;
else if (abs(n1) == abs(n2)) {
if (n1 > n2) return true;
else return false;
}
else return false;
}
};
std::priority_queue<int, std::vector<int>, cmp()> pq3;
※ 참고 문헌
https://cplusplus.com/reference/queue/priority_queue/