模板函式sort_heap具有如下兩個版本
templatevoid sort_heap(_ranit _first, _ranit _last);
templatevoid sort_heap(_ranit _first, _ranit _last, _pr _pred);
其功能是完成區間 [_first, _last) 內元素的堆排序,第乙個版本採用小於操作符(operator<),
第二個版本採用乙個二元謂詞(binary predicate)。
下面將以第乙個版本的演算法源**進行注釋說明
templateinline
void sort_heap(_ranit _first, _ranit _last)
_sort_heap函式
templateinline
void _sort_heap(_ranit _first, _ranit _last)
pop_heap函式
templateinline
void pop_heap(_ranit _first, _ranit _last)
_pop_heap_0函式
templateinline
void _pop_heap_0(_ranit _first, _ranit _last, _ty *)
_pop_heap函式
templateinline
void _pop_heap(_ranit _first, _ranit _last, _ranit _dest,
_ty _val, _diff *)
_adjust_heap函式
templateinline
void _adjust_heap(_ranit _first, _diff _hole, _diff _bottom, _ty _val)
if (_idx == _bottom)
std::_push_heap(_first, _hole, _top, _val);
}
_push_heap函式
templateinline
void _push_heap(_ranit _first, _diff _hole,
_diff _top, _ty _val)
// 找到不小於 _val 的節點
*(_first + _hole) = _val; // drop _val into final hole
}
至此已完成堆排序,不過使用sort_heap需要注意下面三點
(1)首先把建堆,即呼叫make_heap
(2)由於對原末值的儲存是通過引數值傳遞,如_pop_heap及以後的函式中的引數 _val,因而對於某些複雜的自定義型別將不適用,
即expensive type
(3)sort_heap的時間複雜度為o(nlogn)
STL原始碼解析之heap
include include include heap algorithms using namespace std heap的所有元素都必須遵循特別的完全二叉樹排列規則,所有heap不提供遍歷功能,也不提供迭代器 int main vectorivec ia,ia 9 for int i 0 i...
STL原始碼解析 STL 與 泛型程式設計
物件導向程式設計與泛型程式設計template typename t class vector int ar 6 vector int,allocator int vec ar,ar 6 cout count if vec.begin vec.end notl bind2nd less int 6 ...
Fabric 原始碼解析 原始碼目錄解析
這裡對重要的一些目錄進行說明 bccsp 與密碼學 加密 簽名 證書等等 相關的加密服務 將fabric中用到的密碼學相關的函式抽象成了一組介面,便於拓展。bddtests 一種新型的軟體開發模式 行為驅動開 需求 開發 common 一些公共庫 錯誤處理 日誌處理 賬本儲存 策略以及各種工具等等 ...