NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
priority_queue.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_CONTAINER_PRIORITY_QUEUE_HPP__
2#define NEFORCE_CORE_CONTAINER_PRIORITY_QUEUE_HPP__
3
12
15NEFORCE_BEGIN_NAMESPACE__
16
22
35template <typename T, typename Sequence = vector<T>, typename Compare = less<typename Sequence::value_type>>
36class priority_queue : public icollector<priority_queue<T, Sequence, Compare>> {
37 static_assert(is_object_v<T>, "priority queue only contains object types.");
38 static_assert(is_same_v<T, typename Sequence::value_type>, "priority queue require consistent types.");
39
40public:
41 using value_type = typename Sequence::value_type;
42 using difference_type = typename Sequence::difference_type;
43 using size_type = typename Sequence::size_type;
44 using reference = typename Sequence::reference;
45 using const_reference = typename Sequence::const_reference;
46
47private:
49
55 NEFORCE_ALWAYS_INLINE void make_heap_inside() {
56 _NEFORCE make_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
57 }
58
59public:
65 priority_queue() = default;
66
74
80 priority_queue(const Compare& comp, const Sequence& seq) :
81 pair_(exact_arg_construct_tag{}, comp, seq) {
82 make_heap_inside();
83 }
84
90 priority_queue(const Compare& comp, Sequence&& seq) noexcept(is_nothrow_move_constructible_v<Sequence> &&
92 pair_(exact_arg_construct_tag{}, comp, _NEFORCE move(seq)) {
93 make_heap_inside();
94 }
95
103 template <typename Iterator, enable_if_t<is_iter_v<Iterator>, int> = 0>
104 priority_queue(Iterator first, Iterator last, const Sequence& seq) :
105 pair_(default_construct_tag{}, seq) {
106 pair_.value.insert(pair_.value.end(), first, last);
107 make_heap_inside();
108 }
109
116 template <typename Iterator, enable_if_t<is_iter_v<Iterator>, int> = 0>
117 priority_queue(Iterator first, Iterator last) :
118 pair_(default_construct_tag{}, first, last) {
119 make_heap_inside();
120 }
121
129 template <typename Iterator, enable_if_t<is_iter_v<Iterator>, int> = 0>
130 priority_queue(Iterator first, Iterator last, const Compare& comp) :
131 pair_(exact_arg_construct_tag{}, comp, first, last) {
132 make_heap_inside();
133 }
134
143 template <typename Iterator, enable_if_t<is_iter_v<Iterator>, int> = 0>
144 priority_queue(Iterator first, Iterator last, const Compare& comp, const Sequence& seq) :
145 pair_(exact_arg_construct_tag{}, comp, seq) {
146 pair_.value.insert(pair_.value.end(), first, last);
147 make_heap_inside();
148 }
149
158 template <typename Iterator, enable_if_t<is_iter_v<Iterator>, int> = 0>
159 priority_queue(Iterator first, Iterator last, const Compare& comp, Sequence&& seq) :
160 pair_(exact_arg_construct_tag{}, comp, _NEFORCE move(seq)) {
161 pair_.value.insert(pair_.value.end(), first, last);
162 make_heap_inside();
163 }
164
169 NEFORCE_NODISCARD bool empty() const noexcept(noexcept(_NEFORCE declval<Sequence>().empty())) {
170 return pair_.value.empty();
171 }
172
177 NEFORCE_NODISCARD size_type size() const noexcept(noexcept(_NEFORCE declval<Sequence>().size())) {
178 return pair_.value.size();
179 }
180
187 NEFORCE_NODISCARD const_reference top() const noexcept(noexcept(_NEFORCE declval<Sequence>().front())) {
188 return pair_.value.front();
189 }
190
197 void push(const value_type& value) {
198 pair_.value.push_back(value);
199 _NEFORCE push_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
200 }
201
208 void push(value_type&& value) {
209 pair_.value.push_back(_NEFORCE move(value));
210 _NEFORCE push_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
211 }
212
218 void pop() {
219 _NEFORCE pop_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
220 pair_.value.pop_back();
221 }
222
230 template <typename... Args>
231 void emplace(Args&&... args) {
232 pair_.value.emplace_back(_NEFORCE forward<Args>(args)...);
233 _NEFORCE push_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
234 }
235
241 pair_.swap(other.pair_);
242 }
243
250 NEFORCE_NODISCARD bool operator==(const priority_queue& rhs) const
251 noexcept(noexcept(pair_.value == rhs.pair_.value)) {
252 return pair_.value == rhs.pair_.value;
253 }
254
261 NEFORCE_NODISCARD bool operator<(const priority_queue& rhs) const
262 noexcept(noexcept(pair_.value < rhs.pair_.value)) {
263 return pair_.value < rhs.pair_.value;
264 }
265};
266
267#ifdef NEFORCE_STANDARD_17
268template <typename Compare, typename Sequence>
270
271template <typename Iterator, typename Compare = less<iter_value_t<Iterator>>,
272 typename Sequence = vector<iter_value_t<Iterator>>>
273priority_queue(Iterator, Iterator, Compare = Compare(), Sequence = Sequence())
274 -> priority_queue<iter_value_t<Iterator>, Sequence, Compare>;
275#endif
276 // Container
278
279NEFORCE_END_NAMESPACE__
280#endif // NEFORCE_CORE_CONTAINER_PRIORITY_QUEUE_HPP__
优先队列容器适配器
NEFORCE_NODISCARD bool operator==(const priority_queue &rhs) const noexcept(noexcept(pair_.value==rhs.pair_.value))
相等比较操作符
typename Sequence::size_type size_type
大小类型
void swap(priority_queue &other) noexcept(is_nothrow_swappable_v< Sequence > &&is_nothrow_swappable_v< Compare >)
交换两个优先队列的内容
NEFORCE_NODISCARD bool operator<(const priority_queue &rhs) const noexcept(noexcept(pair_.value< rhs.pair_.value))
小于比较操作符
priority_queue()=default
默认构造函数
priority_queue(Iterator first, Iterator last)
范围构造函数
typename Sequence::const_reference const_reference
常量引用类型
typename Sequence::value_type value_type
值类型
priority_queue(const Compare &comp, Sequence &&seq) noexcept(is_nothrow_move_constructible_v< Sequence > &&is_nothrow_copy_constructible_v< Compare >)
构造函数,指定比较函数和移动的底层容器
typename Sequence::difference_type difference_type
差值类型
priority_queue(const Compare &comp, const Sequence &seq)
构造函数,指定比较函数和底层容器副本
NEFORCE_NODISCARD bool empty() const noexcept(noexcept(_NEFORCE declval< Sequence >().empty()))
检查优先队列是否为空
priority_queue(Iterator first, Iterator last, const Compare &comp, Sequence &&seq)
范围构造函数,指定比较函数和移动的底层容器
NEFORCE_NODISCARD size_type size() const noexcept(noexcept(_NEFORCE declval< Sequence >().size()))
获取优先队列大小
void emplace(Args &&... args)
在优先队列中就地构造元素
NEFORCE_NODISCARD const_reference top() const noexcept(noexcept(_NEFORCE declval< Sequence >().front()))
访问优先级最高的元素
priority_queue(Iterator first, Iterator last, const Compare &comp)
范围构造函数,指定比较函数
typename Sequence::reference reference
引用类型
priority_queue(const Compare &comp) noexcept(is_nothrow_default_constructible_v< Sequence > &&is_nothrow_copy_constructible_v< Compare >)
构造函数,指定比较函数
void push(const value_type &value)
插入元素(拷贝版本)
void pop()
移除优先级最高的元素
void push(value_type &&value)
插入元素(移动版本)
priority_queue(Iterator first, Iterator last, const Sequence &seq)
范围构造函数,指定底层容器副本
priority_queue(Iterator first, Iterator last, const Compare &comp, const Sequence &seq)
范围构造函数,指定比较函数和底层容器副本
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
NEFORCE_INLINE17 constexpr bool is_object_v
is_object的便捷变量模板
add_rvalue_reference_t< T > declval() noexcept
获取类型的右值引用,仅用于非求值上下文
NEFORCE_CONSTEXPR20 void pop_heap(Iterator first, Iterator last, Compare comp)
删除堆顶元素
NEFORCE_CONSTEXPR20 void make_heap(Iterator first, Iterator last, Compare comp)
创建堆
NEFORCE_CONSTEXPR20 void push_heap(Iterator first, Iterator last, Compare comp)
向堆中插入元素
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
NEFORCE_INLINE17 constexpr bool is_nothrow_swappable_v
is_nothrow_swappable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_default_constructible_v
is_nothrow_default_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_move_constructible_v
is_nothrow_move_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_copy_constructible_v
is_nothrow_copy_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_same_v
is_same的便捷变量模板
堆算法
压缩对主模板,使用EBCO优化
constexpr compressed_pair & get_base() noexcept
获取基类引用
默认构造标签
精确参数构造标签
集合器接口模板
动态大小数组容器