1#ifndef NEFORCE_CORE_ALGORITHM_HEAP_HPP__
2#define NEFORCE_CORE_ALGORITHM_HEAP_HPP__
14NEFORCE_BEGIN_NAMESPACE__
122template <
typename Iterator,
typename Compare>
123NEFORCE_CONSTEXPR20 Iterator
is_heap_until(Iterator first, Iterator last, Compare comp) {
125 static_assert(
is_invocable_v<Compare,
decltype(*first),
decltype(*first)>,
"Compare must be invocable");
127 auto n = last - first;
129 auto parent = (child - 1) / 2;
130 if (comp(*(first + parent), *(first + child))) {
131 return first + child;
146template <
typename Iterator>
160template <
typename Iterator,
typename Compare>
161NEFORCE_CONSTEXPR20
bool is_heap(Iterator first, Iterator last, Compare comp) {
172template <
typename Iterator>
173NEFORCE_CONSTEXPR20
bool is_heap(Iterator first, Iterator last) {
194template <
typename Iterator,
typename T,
typename Compare>
198 static_assert(
is_invocable_v<Compare,
decltype(*first),
decltype(*first)>,
"Compare must be invocable");
200 auto parent = (hole_index - 1) / 2;
201 while (hole_index > top_index && comp(*(first + parent), value)) {
202 *(first + hole_index) = *(first + parent);
204 parent = (hole_index - 1) / 2;
206 *(first + hole_index) = value;
212template <
typename Iterator,
typename T>
233template <
typename Iterator,
typename Compare>
234NEFORCE_CONSTEXPR20
void push_heap(Iterator first, Iterator last, Compare comp) {
235 if (last - first < 2) {
238 inner::push_heap_aux(first, last - first - 1, 0, *(last - 1), comp);
244template <
typename Iterator>
245NEFORCE_CONSTEXPR20
void push_heap(Iterator first, Iterator last) {
263template <
typename Iterator,
typename T,
typename Compare>
266 auto top_index = hole_index;
267 auto child = 2 * hole_index + 1;
268 while (child < len) {
269 if (child + 1 < len && comp(*(first + child), *(first + child + 1))) {
272 if (!comp(value, *(first + child))) {
275 *(first + hole_index) = *(first + child);
277 child = 2 * hole_index + 1;
279 inner::push_heap_aux(first, hole_index, top_index, value, comp);
285template <
typename Iterator,
typename T>
308template <
typename Iterator,
typename T,
typename Compare>
309NEFORCE_CONSTEXPR20
void pop_heap_aux(Iterator first, Iterator last, Iterator result, T value, Compare comp) {
311 _NEFORCE
adjust_heap(first, 0, last - first, value, comp);
317template <
typename Iterator,
typename T>
318NEFORCE_CONSTEXPR20
void pop_heap_aux(Iterator first, Iterator last, Iterator result, T value) {
337template <
typename Iterator,
typename Compare>
338NEFORCE_CONSTEXPR20
void pop_heap(Iterator first, Iterator last, Compare comp) {
339 if (last - first < 2) {
343 inner::pop_heap_aux(first, last, last, *last, comp);
349template <
typename Iterator>
350NEFORCE_CONSTEXPR20
void pop_heap(Iterator first, Iterator last) {
365template <
typename Iterator,
typename Compare>
366NEFORCE_CONSTEXPR20
void sort_heap(Iterator first, Iterator last, Compare comp) {
367 while (last - first > 1) {
368 _NEFORCE
pop_heap(first, last--, comp);
375template <
typename Iterator>
376NEFORCE_CONSTEXPR20
void sort_heap(Iterator first, Iterator last) {
391template <
typename Iterator,
typename Compare>
392NEFORCE_CONSTEXPR20
void make_heap(Iterator first, Iterator last, Compare comp) {
393 if (last - first < 2) {
396 const auto len = last - first;
401 auto parent = (len - 2) / 2;
403 _NEFORCE
adjust_heap(first, parent, len, *(first + parent), comp);
414template <
typename Iterator>
415NEFORCE_CONSTEXPR20
void make_heap(Iterator first, Iterator last) {
423NEFORCE_END_NAMESPACE__
NEFORCE_CONSTEXPR20 bool is_heap(Iterator first, Iterator last, Compare comp)
检查范围是否为有效堆
NEFORCE_CONSTEXPR20 void pop_heap(Iterator first, Iterator last, Compare comp)
删除堆顶元素
NEFORCE_CONSTEXPR20 void adjust_heap(Iterator first, iter_difference_t< Iterator > hole_index, iter_difference_t< Iterator > len, T value, Compare comp)
堆调整辅助函数
NEFORCE_CONSTEXPR20 void sort_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)
向堆中插入元素
NEFORCE_CONSTEXPR20 Iterator is_heap_until(Iterator first, Iterator last, Compare comp)
查找堆中破坏堆性质的首个元素
NEFORCE_INLINE17 constexpr bool is_invocable_v
is_invocable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_ranges_rnd_iter_v
检查是否为范围随机访问迭代器
typename iterator_traits< Iterator >::value_type iter_value_t
获取迭代器的值类型
typename iterator_traits< Iterator >::difference_type iter_difference_t
获取迭代器的差值类型