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》

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章