NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
heap.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ALGORITHM_HEAP_HPP__
2#define NEFORCE_CORE_ALGORITHM_HEAP_HPP__
3
10
14NEFORCE_BEGIN_NAMESPACE__
15
21
107
122template <typename Iterator, typename Compare>
123NEFORCE_CONSTEXPR20 Iterator is_heap_until(Iterator first, Iterator last, Compare comp) {
124 static_assert(is_ranges_rnd_iter_v<Iterator>, "Iterator must be random_access_iterator");
125 static_assert(is_invocable_v<Compare, decltype(*first), decltype(*first)>, "Compare must be invocable");
126
127 auto n = last - first;
128 for (iter_difference_t<Iterator> child = 1; child < n; ++child) {
129 auto parent = (child - 1) / 2;
130 if (comp(*(first + parent), *(first + child))) {
131 return first + child;
132 }
133 }
134 return last;
135}
136
146template <typename Iterator>
147NEFORCE_CONSTEXPR20 Iterator is_heap_until(Iterator first, Iterator last) {
148 return _NEFORCE is_heap_until(first, last, less<iter_value_t<Iterator>>());
149}
150
160template <typename Iterator, typename Compare>
161NEFORCE_CONSTEXPR20 bool is_heap(Iterator first, Iterator last, Compare comp) {
162 return _NEFORCE is_heap_until(first, last, comp) == last;
163}
164
172template <typename Iterator>
173NEFORCE_CONSTEXPR20 bool is_heap(Iterator first, Iterator last) {
174 return _NEFORCE is_heap_until(first, last) == last;
175}
176
177
179NEFORCE_BEGIN_INNER__
180
194template <typename Iterator, typename T, typename Compare>
195NEFORCE_CONSTEXPR20 void push_heap_aux(Iterator first, iter_difference_t<Iterator> hole_index,
196 iter_difference_t<Iterator> top_index, T value, Compare comp) {
197 static_assert(is_ranges_rnd_iter_v<Iterator>, "Iterator must be random_access_iterator");
198 static_assert(is_invocable_v<Compare, decltype(*first), decltype(*first)>, "Compare must be invocable");
199
200 auto parent = (hole_index - 1) / 2;
201 while (hole_index > top_index && comp(*(first + parent), value)) {
202 *(first + hole_index) = *(first + parent);
203 hole_index = parent;
204 parent = (hole_index - 1) / 2;
205 }
206 *(first + hole_index) = value;
207}
208
212template <typename Iterator, typename T>
213NEFORCE_CONSTEXPR20 void push_heap_aux(Iterator first, iter_difference_t<Iterator> hole_index,
214 iter_difference_t<Iterator> top_index, T value) {
215 inner::push_heap_aux(first, hole_index, top_index, value, less<iter_value_t<Iterator>>());
216}
217
218NEFORCE_END_INNER__
220
221
233template <typename Iterator, typename Compare>
234NEFORCE_CONSTEXPR20 void push_heap(Iterator first, Iterator last, Compare comp) {
235 if (last - first < 2) {
236 return;
237 }
238 inner::push_heap_aux(first, last - first - 1, 0, *(last - 1), comp);
239}
240
244template <typename Iterator>
245NEFORCE_CONSTEXPR20 void push_heap(Iterator first, Iterator last) {
246 _NEFORCE push_heap(first, last, less<iter_value_t<Iterator>>());
247}
248
263template <typename Iterator, typename T, typename Compare>
264NEFORCE_CONSTEXPR20 void adjust_heap(Iterator first, iter_difference_t<Iterator> hole_index,
265 iter_difference_t<Iterator> len, T value, Compare comp) {
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))) {
270 ++child;
271 }
272 if (!comp(value, *(first + child))) {
273 break;
274 }
275 *(first + hole_index) = *(first + child);
276 hole_index = child;
277 child = 2 * hole_index + 1;
278 }
279 inner::push_heap_aux(first, hole_index, top_index, value, comp);
280}
281
285template <typename Iterator, typename T>
286NEFORCE_CONSTEXPR20 void adjust_heap(Iterator first, iter_difference_t<Iterator> hole_index,
287 iter_difference_t<Iterator> len, T value) {
288 _NEFORCE adjust_heap(first, hole_index, len, value, less<iter_value_t<Iterator>>());
289}
290
291
293NEFORCE_BEGIN_INNER__
294
308template <typename Iterator, typename T, typename Compare>
309NEFORCE_CONSTEXPR20 void pop_heap_aux(Iterator first, Iterator last, Iterator result, T value, Compare comp) {
310 *result = *first;
311 _NEFORCE adjust_heap(first, 0, last - first, value, comp);
312}
313
317template <typename Iterator, typename T>
318NEFORCE_CONSTEXPR20 void pop_heap_aux(Iterator first, Iterator last, Iterator result, T value) {
319 inner::pop_heap_aux(first, last, result, value, less<iter_value_t<Iterator>>());
320}
321
322NEFORCE_END_INNER__
324
325
337template <typename Iterator, typename Compare>
338NEFORCE_CONSTEXPR20 void pop_heap(Iterator first, Iterator last, Compare comp) {
339 if (last - first < 2) {
340 return;
341 }
342 --last;
343 inner::pop_heap_aux(first, last, last, *last, comp);
344}
345
349template <typename Iterator>
350NEFORCE_CONSTEXPR20 void pop_heap(Iterator first, Iterator last) {
351 _NEFORCE pop_heap(first, last, less<iter_value_t<Iterator>>());
352}
353
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);
369 }
370}
371
375template <typename Iterator>
376NEFORCE_CONSTEXPR20 void sort_heap(Iterator first, Iterator last) {
377 _NEFORCE sort_heap(first, last, less<iter_value_t<Iterator>>());
378}
379
391template <typename Iterator, typename Compare>
392NEFORCE_CONSTEXPR20 void make_heap(Iterator first, Iterator last, Compare comp) {
393 if (last - first < 2) {
394 return;
395 }
396 const auto len = last - first;
397 if (len < 2) {
398 return;
399 }
400
401 auto parent = (len - 2) / 2;
402 while (true) {
403 _NEFORCE adjust_heap(first, parent, len, *(first + parent), comp);
404 if (parent == 0) {
405 return;
406 }
407 --parent;
408 }
409}
410
414template <typename Iterator>
415NEFORCE_CONSTEXPR20 void make_heap(Iterator first, Iterator last) {
416 _NEFORCE make_heap(first, last, less<iter_value_t<Iterator>>());
417}
418 // HeapAlgorithms
420 // StandardAlgorithms
422
423NEFORCE_END_NAMESPACE__
424#endif // NEFORCE_CORE_ALGORITHM_HEAP_HPP__
仿函数
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
获取迭代器的差值类型
统一调用接口
迭代器操作算法
小于比较仿函数