STL源码解析 - make_heap

模板函数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》

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值