1#ifndef MSTL_CORE_CONTAINER_PRIORITY_QUEUE_HPP__
2#define MSTL_CORE_CONTAINER_PRIORITY_QUEUE_HPP__
7template <
typename T,
typename Sequence = vector<T>,
8 typename Compare = less<
typename Sequence::value_type>>
9class priority_queue :
public icollector<priority_queue<T, Sequence, Compare>> {
12 using value_type =
typename Sequence::value_type;
13 using size_type =
typename Sequence::size_type;
14 using reference =
typename Sequence::reference;
15 using const_reference =
typename Sequence::const_reference;
17 static_assert(is_object_v<T>,
"priority queue only contains object types.");
18 static_assert(is_same_v<T, value_type>,
"priority queue require consistent types.");
21 compressed_pair<Compare, Sequence> pair_{ default_construct_tag{} };
23 void make_heap_inside() {
24 _MSTL make_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
28 priority_queue() =
default;
30 explicit priority_queue(
const Compare& comp)
31 noexcept(is_nothrow_default_constructible_v<Sequence> && is_nothrow_copy_constructible_v<Compare>)
32 : pair_(exact_arg_construct_tag{}, comp) {}
34 priority_queue(
const Compare& comp,
const Sequence& seq)
35 : pair_(exact_arg_construct_tag{}, comp, seq) {
39 priority_queue(
const Compare& comp, Sequence&& seq)
40 noexcept(is_nothrow_move_constructible_v<Sequence> && is_nothrow_copy_constructible_v<Compare>)
41 : pair_(exact_arg_construct_tag{}, comp,
_MSTL move(seq)) {
45 template <
typename Iterator>
46 priority_queue(Iterator first, Iterator last,
const Sequence& seq)
47 : pair_(default_construct_tag{}, seq) {
48 pair_.value.insert(pair_.value.end(), first, last);
52 template <
typename Iterator>
53 priority_queue(Iterator first, Iterator last)
54 : pair_(default_construct_tag{}, first, last) {
58 template <
typename Iterator>
59 priority_queue(Iterator first, Iterator last,
const Compare& comp)
60 : pair_(exact_arg_construct_tag{}, comp, first, last) {
64 template <
typename Iterator>
65 priority_queue(Iterator first, Iterator last,
const Compare& comp,
const Sequence& seq)
66 : pair_(exact_arg_construct_tag{}, comp, seq) {
67 pair_.value.insert(pair_.value.end(), first, last);
71 template <
typename Iterator>
72 priority_queue(Iterator first, Iterator last,
const Compare& comp, Sequence&& seq)
73 : pair_(exact_arg_construct_tag{}, comp,
_MSTL move(seq)) {
74 pair_.value.insert(pair_.value.end(), first, last);
78 MSTL_NODISCARD
bool empty() const noexcept(noexcept(
_MSTL declval<Sequence>().empty())) {
return pair_.value.empty(); }
79 MSTL_NODISCARD size_type
size() const noexcept(noexcept(
_MSTL declval<Sequence>().size())) {
return pair_.value.size(); }
81 MSTL_NODISCARD const_reference top() const noexcept(noexcept(
_MSTL declval<Sequence>().front())) {
return pair_.value.front(); }
83 void push(
const value_type& x) {
84 pair_.value.push_back(x);
85 _MSTL push_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
87 void push(value_type&& x) {
89 _MSTL push_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
93 _MSTL pop_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
94 pair_.value.pop_back();
97 template <
typename... Args>
98 void emplace(Args&&... args) {
100 _MSTL push_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
103 void swap(priority_queue& x)
noexcept(is_nothrow_swappable_v<Sequence> && is_nothrow_swappable_v<Compare>) {
107 MSTL_NODISCARD
bool operator ==(
const priority_queue& rhs)
const
108 noexcept(
noexcept(pair_.value == rhs.pair_.value)) {
109 return pair_.value == rhs.pair_.value;
111 MSTL_NODISCARD
bool operator <(
const priority_queue& rhs)
const
112 noexcept(
noexcept(pair_.value < rhs.pair_.value)) {
113 return pair_.value < rhs.pair_.value;
116#ifdef MSTL_SUPPORT_DEDUCTION_GUIDES__
117template <
typename Compare,
typename Sequence>
118priority_queue(Compare, Sequence) -> priority_queue<typename Sequence::value_type, Sequence, Compare>;
120template <
typename Iterator,
typename Compare = less<iter_value_t<Iterator>>,
121 typename Sequence = vector<iter_value_t<Iterator>>>
122priority_queue(Iterator, Iterator, Compare = Compare(), Sequence = Sequence())
123-> priority_queue<iter_value_t<Iterator>, Sequence, Compare>;
MSTL_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
MSTL_CONSTEXPR20 void make_heap(Iterator first, Iterator last, Compare comp)
创建堆
MSTL_CONSTEXPR20 void pop_heap(Iterator first, Iterator last, Compare comp)
删除堆顶元素
MSTL_CONSTEXPR20 void push_heap(Iterator first, Iterator last, Compare comp)
向堆中插入元素
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result)
移动范围元素
void swap()=delete
删除无参数的swap重载
MSTL_NODISCARD constexpr decltype(auto) size() const noexcept(noexcept(derived().size()))
获取集合大小
MSTL_NODISCARD constexpr bool empty() const noexcept(noexcept(derived().empty()))
检查集合是否为空