1#ifndef NEFORCE_CORE_CONTAINER_PRIORITY_QUEUE_HPP__
2#define NEFORCE_CORE_CONTAINER_PRIORITY_QUEUE_HPP__
15NEFORCE_BEGIN_NAMESPACE__
35template <
typename T,
typename Sequence = vector<T>,
typename Compare = less<
typename Sequence::value_type>>
37 static_assert(
is_object_v<T>,
"priority queue only contains object types.");
55 NEFORCE_ALWAYS_INLINE
void make_heap_inside() {
103 template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
106 pair_.value.insert(pair_.value.end(), first, last);
116 template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
129 template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
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) :
146 pair_.value.insert(pair_.value.end(), first, last);
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) :
161 pair_.value.insert(pair_.value.end(), first, last);
170 return pair_.value.empty();
178 return pair_.value.size();
188 return pair_.value.front();
198 pair_.value.push_back(value);
199 _NEFORCE
push_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
209 pair_.value.push_back(_NEFORCE
move(value));
210 _NEFORCE
push_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
219 _NEFORCE
pop_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
220 pair_.value.pop_back();
230 template <
typename... Args>
233 _NEFORCE
push_heap(pair_.value.begin(), pair_.value.end(), pair_.get_base());
241 pair_.swap(other.pair_);
251 noexcept(
noexcept(pair_.value == rhs.pair_.value)) {
252 return pair_.value == rhs.pair_.value;
262 noexcept(
noexcept(pair_.value < rhs.pair_.value)) {
263 return pair_.value < rhs.pair_.value;
267#ifdef NEFORCE_STANDARD_17
268template <
typename Compare,
typename Sequence>
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())
279NEFORCE_END_NAMESPACE__
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 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的便捷变量模板
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的便捷变量模板
constexpr compressed_pair & get_base() noexcept
获取基类引用