模板函数make_heap具有如下两个版本
template<class _RanIt> void make_heap(_RanIt _First, _RanIt _Last);
template<class _RanIt, class _Pr> void make_heap(_RanIt _First, _RanIt _Last, _Pr _Pred);
第一个版本采用小于操作符(operator<),第二个版本采用二元谓词(binary predicate)
建堆是进行堆排序(sort_heap)的前提,即在调用sort_heap应该先调用make_heap
下面对make_heap的源代码注释说明,以第一个版本为例,第二个版本类似
template<class _RanIt> inline void make_heap(_RanIt _First, _RanIt _Last) { // make [_First, _Last) into a heap, using operator< _DEBUG_RANGE(_First, _Last); // 如果元素多于一个则建堆(大根堆) if (1 < _Last - _First) _Make_heap(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dist_type(_First), _Val_type(_First)); }
_Make_heap函数
template<class _RanIt, class _Diff, class _Ty> inline void _Make_heap(_RanIt _First, _RanIt _Last, _Diff *, _Ty *) { // make nontrivial [_First, _Last) into a heap, using operator< _Diff _Bottom = _Last - _First; // 从第一个非叶子节点开始,自顶向上建堆 for (_Diff _Hole = _Bottom / 2; 0 < _Hole; ) { // reheap top half, bottom to top --_Hole; // 调整元素以满足大根堆条件 // 注意当前节点是以值传递为参数 std::_Adjust_heap(_First, _Hole, _Bottom, _Ty(*(_First + _Hole))); } }
_Adjust_heap请参考文章《STL - sort_heap》