1#ifndef MSTL_CORE_ALGORITHM_HEAP_HPP__
2#define MSTL_CORE_ALGORITHM_HEAP_HPP__
35template <
typename Iterator,
typename Compare, enable_if_t<is_ranges_rnd_iter_v<Iterator>,
int> = 0>
36MSTL_CONSTEXPR20 Iterator
is_heap_until(Iterator first, Iterator last, Compare comp) {
38 Distance n = last - first;
39 for (Distance child = 1; child < n; ++child) {
40 Distance parent = (child - 1) / 2;
41 if (comp(*(first + parent), *(first + child))) {
57template <
typename Iterator, enable_if_t<is_ranges_rnd_iter_v<Iterator>,
int> = 0>
71template <
typename Iterator,
typename Compare, enable_if_t<is_ranges_rnd_iter_v<Iterator>,
int> = 0>
72MSTL_CONSTEXPR20
bool is_heap(Iterator first, Iterator last, Compare comp) {
83template <
typename Iterator, enable_if_t<is_ranges_rnd_iter_v<Iterator>,
int> = 0>
84MSTL_CONSTEXPR20
bool is_heap(Iterator first, Iterator last) {
106template <
typename Iterator,
typename Distance,
typename T,
typename Compare,
108MSTL_CONSTEXPR20
void push_heap_aux(Iterator first, Distance hole_index, Distance top_index, T value, Compare comp) {
109 Distance parent = (hole_index - 1) / 2;
110 while (hole_index > top_index && comp(*(first + parent), value)) {
111 *(first + hole_index) = *(first + parent);
113 parent = (hole_index - 1) / 2;
115 *(first + hole_index) = value;
121template <
typename Iterator,
typename Distance,
typename T, enable_if_t<is_ranges_rnd_iter_v<Iterator>,
int> = 0>
122MSTL_CONSTEXPR20
void push_heap_aux(Iterator first, Distance hole_index, Distance top_index, T value) {
141template <
typename Iterator,
typename Compare, enable_if_t<is_ranges_rnd_iter_v<Iterator>,
int> = 0>
142MSTL_CONSTEXPR20
void push_heap(Iterator first, Iterator last, Compare comp) {
144 if (last - first < 2)
return;
145 _INNER push_heap_aux(first, Distance(last - first - 1), Distance(0), *(last - 1), comp);
151template <
typename Iterator, enable_if_t<is_ranges_rnd_iter_v<Iterator>,
int> = 0>
152MSTL_CONSTEXPR20
void push_heap(Iterator first, Iterator last) {
171template <
typename Iterator,
typename Distance,
typename T,
typename Compare,
173MSTL_CONSTEXPR20
void adjust_heap(Iterator first, Distance hole_index, Distance len, T value, Compare comp) {
174 Distance top_index = hole_index;
175 Distance child = 2 * hole_index + 1;
176 while (child < len) {
177 if (child + 1 < len && comp(*(first + child), *(first + child + 1))) {
180 if (!comp(value, *(first + child))) {
183 *(first + hole_index) = *(first + child);
185 child = 2 * hole_index + 1;
187 _INNER push_heap_aux(first, hole_index, top_index, value, comp);
193template <
typename Iterator,
typename Distance,
typename T,
195MSTL_CONSTEXPR20
void adjust_heap(Iterator first, Distance hole_index, Distance len, T value) {
216template <
typename Iterator,
typename T,
typename Compare, enable_if_t<is_ranges_rnd_iter_v<Iterator>,
int> = 0>
217MSTL_CONSTEXPR20
void pop_heap_aux(Iterator first, Iterator last, Iterator result, T value, Compare comp) {
226template <
typename Iterator,
typename T, enable_if_t<is_ranges_rnd_iter_v<Iterator>,
int> = 0>
227MSTL_CONSTEXPR20
void pop_heap_aux(Iterator first, Iterator last, Iterator result, T value) {
246template <
typename Iterator,
typename Compare, enable_if_t<is_ranges_rnd_iter_v<Iterator>,
int> = 0>
247MSTL_CONSTEXPR20
void pop_heap(Iterator first, Iterator last, Compare comp) {
248 if (last - first < 2)
return;
250 _INNER pop_heap_aux(first, last, last, *last, comp);
256template <
typename Iterator, enable_if_t<is_ranges_rnd_iter_v<Iterator>,
int> = 0>
257MSTL_CONSTEXPR20
void pop_heap(Iterator first, Iterator last) {
272template <
typename Iterator,
typename Compare, enable_if_t<is_ranges_rnd_iter_v<Iterator>,
int> = 0>
273MSTL_CONSTEXPR20
void sort_heap(Iterator first, Iterator last, Compare comp) {
274 while (last - first > 1) {
282template <
typename Iterator, enable_if_t<is_ranges_rnd_iter_v<Iterator>,
int> = 0>
283MSTL_CONSTEXPR20
void sort_heap(Iterator first, Iterator last) {
298template <
typename Iterator,
typename Compare, enable_if_t<is_ranges_rnd_iter_v<Iterator>,
int> = 0>
299MSTL_CONSTEXPR20
void make_heap(Iterator first, Iterator last, Compare comp) {
300 if (last - first < 2)
return;
302 Distance len = last - first;
305 Distance parent = (len - 2) / 2;
308 if (parent == 0)
return;
316template <
typename Iterator, enable_if_t<is_ranges_rnd_iter_v<Iterator>,
int> = 0>
317MSTL_CONSTEXPR20
void make_heap(Iterator first, Iterator last) {
MSTL_CONSTEXPR20 void adjust_heap(Iterator first, Distance hole_index, Distance len, T value, Compare comp)
堆调整辅助函数
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)
向堆中插入元素
MSTL_CONSTEXPR20 void sort_heap(Iterator first, Iterator last, Compare comp)
将堆转换为有序序列
MSTL_CONSTEXPR20 Iterator is_heap_until(Iterator first, Iterator last, Compare comp)
查找堆中破坏堆性质的首个元素
MSTL_CONSTEXPR20 bool is_heap(Iterator first, Iterator last, Compare comp)
检查范围是否为有效堆
typename iterator_traits< Iterator >::value_type iter_value_t
获取迭代器的值类型
typename iterator_traits< Iterator >::difference_type iter_difference_t
获取迭代器的差值类型
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名