MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
priority_queue.hpp
1#ifndef MSTL_CORE_CONTAINER_PRIORITY_QUEUE_HPP__
2#define MSTL_CORE_CONTAINER_PRIORITY_QUEUE_HPP__
4#include "vector.hpp"
6
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>> {
10
11public:
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;
16
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.");
19
20private:
21 compressed_pair<Compare, Sequence> pair_{ default_construct_tag{} };
22
23 void make_heap_inside() {
24 _MSTL make_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
25 }
26
27public:
28 priority_queue() = default;
29
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) {}
33
34 priority_queue(const Compare& comp, const Sequence& seq)
35 : pair_(exact_arg_construct_tag{}, comp, seq) {
36 make_heap_inside();
37 }
38
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)) {
42 make_heap_inside();
43 }
44
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);
49 make_heap_inside();
50 }
51
52 template <typename Iterator>
53 priority_queue(Iterator first, Iterator last)
54 : pair_(default_construct_tag{}, first, last) {
55 make_heap_inside();
56 }
57
58 template <typename Iterator>
59 priority_queue(Iterator first, Iterator last, const Compare& comp)
60 : pair_(exact_arg_construct_tag{}, comp, first, last) {
61 make_heap_inside();
62 }
63
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);
68 make_heap_inside();
69 }
70
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);
75 make_heap_inside();
76 }
77
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(); }
80
81 MSTL_NODISCARD const_reference top() const noexcept(noexcept(_MSTL declval<Sequence>().front())) { return pair_.value.front(); }
82
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());
86 }
87 void push(value_type&& x) {
88 pair_.value.push_back(_MSTL move(x));
89 _MSTL push_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
90 }
91
92 void pop() {
93 _MSTL pop_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
94 pair_.value.pop_back();
95 }
96
97 template <typename... Args>
98 void emplace(Args&&... args) {
99 pair_.value.emplace_back(_MSTL forward<Args>(args)...);
100 _MSTL push_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
101 }
102
103 void swap(priority_queue& x) noexcept(is_nothrow_swappable_v<Sequence> && is_nothrow_swappable_v<Compare>) {
104 pair_.swap(x.pair_);
105 }
106
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;
110 }
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;
114 }
115};
116#ifdef MSTL_SUPPORT_DEDUCTION_GUIDES__
117template <typename Compare, typename Sequence>
118priority_queue(Compare, Sequence) -> priority_queue<typename Sequence::value_type, Sequence, Compare>;
119
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>;
124#endif
125
127#endif // MSTL_CORE_CONTAINER_PRIORITY_QUEUE_HPP__
MSTL_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
add_rvalue_reference_t< T > declval() 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堆算法
集合器接口模板
MSTL_NODISCARD constexpr decltype(auto) size() const noexcept(noexcept(derived().size()))
获取集合大小
MSTL_NODISCARD constexpr bool empty() const noexcept(noexcept(derived().empty()))
检查集合是否为空