注意:
1 如果要用到小頂堆,則一般要把模板的三個引數都帶進去。 stl裡面定義了乙個仿函式 greater<>,對於基本型別可以用這個仿函式宣告小頂堆
#include #include using namespace std;
int main()
getchar();
return 0;
}
2 為了指定第三個模板引數,我們必須將前兩個引數都指明出來(這是c++語法規則).
stack與queue注意事項:
1 stack不允許有遍歷行為,stack也不提供迭代器。sgi stl便以deque作為預設情況下stack底部結構,稱之為adapter(配接器)
2 除了deque之外,list也是雙向開口的資料結構
3 queue與stack的情況類似,不提供迭代器,也可以以list作為底層容器,預設為deque。
priority_queue的底層實現——heap
預設情況下priority_queue優先順序佇列是利用乙個max-heap最大堆完成,後者是乙個以vector表現的完全二叉樹。
「依權值高低自動遞減排序」
1 priority_queue允許使用者以任何次序將任何元素推入容器內,但取出時一定是從優先權最高(也即數值最高,最大堆)的元素開始取。
2 二叉堆,完全二叉樹,(由陣列實現,陣列來儲存所有節點,2*i+1,2*i+2,但是由於動態改變大小,所以不用array用vector)插入o(logn),刪除o(logn)
本人親自實現的堆排序過程:
#include #include #include using namespace std;
/*調整堆:預設最大堆,每次調整結束後,堆頂即為最大值。
類似於:向上冒泡的過程。
*/void maxheapfixdown(int a, int i, int n)
for (int k = 1; k <= n - 1; ++k)//建堆時相當於完成了一次堆調整,還需要n-1次堆調整。
}#define n 500
int main()
for (int i = 0; i < n; i++)
cout << endl;
cout << "********************" << endl;
heap_sort(a, n);
for (int i = 0; i < n; i++)
cout << endl;
system("pause");
return 0;
}
stl heap包括:
1 push_heap演算法:新元素插入在底層的vector的end()處。向上回溯
2 pop_heap演算法:把堆頂元素和數值末尾元素調換,向下回溯。
3 sort_heap演算法:持續對整個heap做pop_heap操作,每次將操作範圍從後向前縮減乙個元素。執行過後,原來的heap不再是個合法的heap了。
4 meak_heap演算法:找出第乙個需要重排的子樹頭部(n-2)/2,從當前位置向根節點回溯。
C STL的priority queue用法總結
翻了很多部落格的總結 1 標頭檔案 include 2 定義 cpp view plain copy priority queue int p 3 優先輸出大資料 priority queue type為資料型別,container為儲存資料的容器,functional為元素比較方式。如果不寫後兩個...
priority queue的常見用法
其底層是用堆來進行實現的 在優先佇列中,隊首元素一定是當前佇列中優先順序最高的那乙個 當然,可以在任何時候往優先佇列裡面加入push元素 而優先佇列底層的資料結構堆 heap 會隨時調整結構 使得每次的隊首元素都是優先順序最大的 1 定義 priority queuename 2 容器內元素的訪問 ...
PriorityQueue實現原理
priorityqueue priorityqueue是個基於優先順序堆的極大優先順序佇列 此佇列按照在構造時所指定的順序對元素排序,既可以根據元素的自然順序來指定排序 參閱 comparable 也可以根據 comparator 來指定 這取決於使用哪種構造方法。優先順序佇列不允許 null 元素...