C++/STL
std::priority_queue 정리
bluespacedev
2022. 4. 7. 15:02
헤더
#include <queue>
기본 형태
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
priority_queue는 heap 자료구조로 compare 기준으로 정렬되서 나열되어 있는 컨테이너이다.
default로 compare가 less 로 설정(내림차순)으로 설정되어있다.
파라미터
| T | 저장되는 element type |
| Container | elememt를 저장할 때 사용하는 컨테이너 |
| Compare | 정렬할 기준 priority_queue는 가장 큰 element를 먼저 output하기 때문에 queue의 앞에는 약간 순서 대로 정렬되어 있다. |
멤버 타입
| member type | definition |
| container_type | Container |
| value_compare | Compare |
| value_type | Container::value_type |
| size_type | Container::size_type |
| reference | Container::reference |
| const_reference | Container::const_reference |
멤버 함수
Element access
| top | top 요소 접근 |
Capacity
| empty | 컨테이너가 비어있는지 확인 |
| size | element 수 |
Modifiers
| push | element 삽입 |
| emplace | push와 비슷한데 construct elements in-place 해서 바로 삽입 pair<int,int> 데이터 타입 경우 emplace(1,1)로 가능 make_pair 안써도 됨 |
| pop | top element 제거 |
| swap | 내부에서 element swap |
C++17 Deduction guides
다양한 형태
template <class Comp, class Container>
priority_queue(Comp, Container)
-> priority_queue<typename Container::value_type, Container, Comp>;
template<class InputIt,
class Comp = std::less</*iter-value-type*/<InputIt>>,
class Container = std::vector</*iter-value-type*/<InputIt>>
priority_queue(InputIt, InputIt, Comp = Comp(), Container = Container())
-> priority_queue</*iter-value-type*/<InputIt>, Container, Comp>;
template<class Comp, class Container, class Alloc>
priority_queue(Comp, Container, Alloc)
-> priority_queue<typename Container::value_type, Container, Comp>;
template<class InputIt, class Alloc>
priority_queue(InputIt, InputIt, Alloc)
-> priority_queue</*iter-value-type*/<InputIt>,
std::vector</*iter-value-type*/<InputIt>, Alloc>,
std::less</*iter-value-type*/<InputIt>>>;
template<class InputIt, class Comp, class Alloc>
priority_queue(InputIt, InputIt, Comp, Alloc)
-> priority_queue</*iter-value-type*/<InputIt>,
std::vector</*iter-value-type*/<InputIt>, Alloc>, Comp>;
template<class InputIt, class Comp, class Container, class Alloc>
priority_queue(InputIt, InputIt, Comp, Container, Alloc)
-> priority_queue<typename Container::value_type, Container, Comp>;
예시
priority_queue pq {std::greater<int>{}, v}; // deduces std::priority_queue<
// int, std::vector<int>,
// std::greater<int>>
priority_queue pq {v.begin(), v.end()}; // deduces std::priority_queue<int>