MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
heap.hpp
浏览该文件的文档.
1#ifndef MSTL_CORE_ALGORITHM_HEAP_HPP__
2#define MSTL_CORE_ALGORITHM_HEAP_HPP__
3
10
14
20
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) {
37 using Distance = iter_difference_t<Iterator>;
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))) {
42 return first + child;
43 }
44 }
45 return last;
46}
47
57template <typename Iterator, enable_if_t<is_ranges_rnd_iter_v<Iterator>, int> = 0>
58MSTL_CONSTEXPR20 Iterator is_heap_until(Iterator first, Iterator last) {
59 return _MSTL is_heap_until(first, last, less<iter_value_t<Iterator>>());
60}
61
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) {
73 return _MSTL is_heap_until(first, last, comp) == last;
74}
75
83template <typename Iterator, enable_if_t<is_ranges_rnd_iter_v<Iterator>, int> = 0>
84MSTL_CONSTEXPR20 bool is_heap(Iterator first, Iterator last) {
85 return _MSTL is_heap_until(first, last) == last;
86}
87
88
91
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);
112 hole_index = parent;
113 parent = (hole_index - 1) / 2;
114 }
115 *(first + hole_index) = value;
116}
117
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) {
123 _INNER push_heap_aux(first, hole_index, top_index, value, less<iter_value_t<Iterator>>());
124}
125
128
129
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) {
143 using Distance = iter_difference_t<Iterator>;
144 if (last - first < 2) return;
145 _INNER push_heap_aux(first, Distance(last - first - 1), Distance(0), *(last - 1), comp);
146}
147
151template <typename Iterator, enable_if_t<is_ranges_rnd_iter_v<Iterator>, int> = 0>
152MSTL_CONSTEXPR20 void push_heap(Iterator first, Iterator last) {
154}
155
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))) {
178 ++child;
179 }
180 if (!comp(value, *(first + child))) {
181 break;
182 }
183 *(first + hole_index) = *(first + child);
184 hole_index = child;
185 child = 2 * hole_index + 1;
186 }
187 _INNER push_heap_aux(first, hole_index, top_index, value, comp);
188}
189
193template <typename Iterator, typename Distance, typename T,
195MSTL_CONSTEXPR20 void adjust_heap(Iterator first, Distance hole_index, Distance len, T value) {
196 _MSTL adjust_heap(first, hole_index, len, value, less<iter_value_t<Iterator>>());
197}
198
199
202
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) {
218 using Distance = iter_difference_t<Iterator>;
219 *result = *first;
220 _MSTL adjust_heap(first, Distance(0), Distance(last - first), value, comp);
221}
222
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) {
228 _INNER pop_heap_aux(first, last, result, value, less<iter_value_t<Iterator>>());
229}
230
233
234
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;
249 --last;
250 _INNER pop_heap_aux(first, last, last, *last, comp);
251}
252
256template <typename Iterator, enable_if_t<is_ranges_rnd_iter_v<Iterator>, int> = 0>
257MSTL_CONSTEXPR20 void pop_heap(Iterator first, Iterator last) {
258 _MSTL pop_heap(first, last, less<iter_value_t<Iterator>>());
259}
260
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) {
275 _MSTL pop_heap(first, last--, comp);
276 }
277}
278
282template <typename Iterator, enable_if_t<is_ranges_rnd_iter_v<Iterator>, int> = 0>
283MSTL_CONSTEXPR20 void sort_heap(Iterator first, Iterator last) {
285}
286
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;
301 using Distance = iter_difference_t<Iterator>;
302 Distance len = last - first;
303 if (len < 2) return;
304
305 Distance parent = (len - 2) / 2;
306 while (true) {
307 _MSTL adjust_heap(first, parent, len, *(first + parent), comp);
308 if (parent == 0) return;
309 --parent;
310 }
311}
312
316template <typename Iterator, enable_if_t<is_ranges_rnd_iter_v<Iterator>, int> = 0>
317MSTL_CONSTEXPR20 void make_heap(Iterator first, Iterator last) {
319}
320 // HeapAlgorithms
322
324#endif // MSTL_CORE_ALGORITHM_HEAP_HPP__
MSTL仿函数
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的便捷别名
MSTL迭代器操作算法
小于比较仿函数