C++ 우선순위 큐
알고리즘 문제를 풀다보면, C++에서 우선순위 큐를 사용해야할 경우가 종종 생긴다
이를 기록하기 위해 정리한 글
우선순위 큐
- C++에서 vector와 같은 container adaptor의 한 종류
- 큐의 한 종류로
#include <queue>
에 포함되어있음 - 모든 원소 중에서 가장 큰 값이 Top을 유지하도록 설계된 컨테이너
- 내부적으로는 Heap 자료 구조를 사용하고 있음
- 각 원소가 우선순위를 가지고 있어, 우선순위를 갖는 원소가 앞쪽에 오게 됨
- 일종의 자동으로 정렬되는 큐라고 생각하면 편함
생성자
priority_queue<자료형, 내부 컨테이너, 정렬기준>
으로 선언
- 자료형 : int, double, 구조체 등등..
- 기본적으로 vector<자료형>으로 정의됨. 벡터 이외의 다른 배열을 사용해도 되나 벡터가 제일 편함자료형>
- 알고리즘 문제풀때는 간단히
priority_queue< pair<int, int> >
이런식으로 간략히 쓰는데, 실제로는priority_queue< pair<int, int>, vector<pair<int,int>>, less<int> > pq
로 알아서 만들어 주는것임 - 정렬 기준 :
less<자료형>()
→ Max Heap,greater<자료형>()
→min heap
멤버 함수
bool empty()
: 비었는지 체크size_type size()
: 크기 체크const value_type & top()
: 맨 앞 원소 체크void push(const value_type& val)
: 원소 넣기. 우선순위에 따라 위치 알아서 조절됨void pop()
: 맨 앞 원소 빼기
원하는 순서대로 원소 정렬하기
cpp에서 우선순위 큐는 기본적으로 최대힙으로 동작한다
이는 큰 수가 가장 먼저 pop되므로, 내림차순으로 출력되는 것을 의미하는데
1
2
3
4
5
6
7
8
9
priority_queue<int> pq;
// priority_queue<int, vector<int>, less<int>> pq; 와 같음 // std::less<>이용
pq.push(3);
pq.push(2);
pq.push(7);
pq.push(2);
pq.push(5);
최대힙, 내림차순이므로 pq : 7 5 3 2 2
로 정렬된다
만약 오름차순으로 출력하고 싶다면
1
2
3
4
5
6
7
priority_queue<int, vector<int, greater<int> > pq; // 선언시 오름차순 정렬로 선언 // std::greater<> 이용
pq.push(3);
pq.push(2);
pq.push(7);
pq.push(2);
pq.push(5);
최소힙, 오름차순이므로 pq : 2 2 3 5 7
로 정렬된다
2. 사용자 정의 비교 함수 구현
하나의 원소를 비교할 때는 std::less<>, std::greater<>
를 써도 충분하지만
두개 이상의 원소를 비교할 때는 직접 비교 함수를 구현해야한다
비교함수를 작성하는 것은 내용이 많아 다음 포스팅으로 나눔
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.