STL原始碼解析之heap

2021-10-25 03:48:29 字數 1982 閱讀 5062

#include #include #include // heap algorithms

using namespace std;

// heap的所有元素都必須遵循特別的完全二叉樹排列規則,所有heap不提供遍歷功能,也不提供迭代器

int main()

; vectorivec(ia, ia + 9);

for (int i = 0; i < ivec.size(); ++i)

cout << ivec[i] << ' ';

cout << endl;

make_heap(ivec.begin(), ivec.end());

for (int i = 0; i < ivec.size(); ++i)

cout << ivec[i] << ' ';

cout << endl;

ivec.push_back(7);

push_heap(ivec.begin(), ivec.end());

for (int i = 0; i < ivec.size(); ++i)

cout << ivec[i] << ' ';

cout << endl;

pop_heap(ivec.begin(), ivec.end());

cout << ivec.back() << endl; // 9 返回但是不移除

ivec.pop_back(); // 移除最後乙個元素,不返回

for (int i = 0; i < ivec.size(); i++)

cout << ivec[i] << ' ';

cout << endl;

sort_heap(ivec.begin(), ivec.end());

for (int i = 0; i < ivec.size(); ++i)

cout << ivec[i] << ' ';

cout << endl;

make_heap(ivec.begin(), ivec.end());

for (int i = 0; i < ivec.size(); ++i)

cout << ivec[i] << ' ';

cout << endl;

}

輸出:

// test heap (底層以array完成)

int ia[9] = ;

make_heap(ia, ia + 9);

for (int i = 0; i < 9; ++i)

cout << ia[i] << ' ';

cout << endl;

// 經排序之後的heap,不再是乙個合法的heap

// array無法動態改變大小,因此不可以對滿載的array進行push_heap()操作

// 因為那得先在array尾端增加乙個元素。如果對乙個滿載的array執行

// push_heap(), 該函式會將最後乙個元素視為新增元素,並將其餘元素視為乙個

// 完整的heap結構(實際上它們的確實), 因此執行後的結構等於原先的heap

sort_heap(ia, ia + 9);

for (int i = 0; i < 9; ++i)

cout << ia[i] << ' ';

cout << endl; // 經排序之後的heap,不再是乙個合法的heap

// 重新再做乙個heap

STL原始碼解析 sort heap

模板函式sort heap具有如下兩個版本 templatevoid sort heap ranit first,ranit last templatevoid sort heap ranit first,ranit last,pr pred 其功能是完成區間 first,last 內元素的堆排序,...

STL原始碼 heap最大堆,最小堆

最大堆和最小堆都是一棵完全二叉樹。最大堆 是指根節點的關鍵字值是堆中的最大關鍵字值,且每個節點若有兒子節點,其關鍵字值都不小於其兒子節點的關鍵字值。最小堆 是指根節點的關鍵字值是堆中的最小關鍵字值,且每個節點若有兒子節點,其關鍵字值都不大於其兒子節點的關鍵字值。步驟 把當前節點數i設定為已知堆的節點...

Spring原始碼解析之 Aop原始碼解析(2)

spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...