make_heap()等函數的用法
阿新 • • 發佈:2019-03-30
pan include 完成 logs ace span 使用 容器 開始
1.make_heap()
make_heap()用於把一個可叠代容器變成一個堆,默認是大頂堆。
它有三個參數。第一個參數是指向開始元素的叠代器,第二個參數是指向最末尾元素的叠代器,第三個參數是less<>()或是greater<>(),前者用於生成大頂堆,後者用於生成小頂堆,第三個參數默認情況下為less<>(),less<int>()用於生成大頂堆。
要使用less<int>(),以及greater<int>(),請添加頭文件#include <functional>,且一定要加括號less<>()
舉例:
#include<iostream> #include<vector> #include<algorithm> #include <queue> #include <functional> using namespace std; int main(){ vector<int> q; for (int i = 0; i < 10; i++) { q.push_back(i); } make_heap(q.begin(), q.end(),less<int>()); for (int i = 0; i < q.size(); i++) { cout << q[i] << ""; } return 0; }
q在完成初始化後,make_heap()使其滿足了大頂堆的特性。
2.pop_heap()
pop_heap()用於將堆的第零個元素與最後一個元素交換位置,然後針對前n - 1個元素調用make_heap()函數,它也有三個參數,參數意義與make_heap()相同,第三個參數應與make_heap時的第三個參數保持一致。
註意:pop_heap()函數,只是交換了兩個數據的位置,如果需要彈出這個數據,請記得在pop_heap()後加上
q.pop_back();
例子:
#include<iostream> #include<vector> #include<algorithm> #include <queue> #include <functional> usingnamespace std; void display(vector<int>q) { for (int i = 0; i < q.size(); i++) { cout << q[i] << " "; } cout << endl; } int main(){ vector<int> q; for (int i = 0; i < 10; i++) { q.push_back(i); } make_heap(q.begin(), q.end(),less<int>()); display(q); pop_heap(q.begin(), q.end(), less<int>()); display(q); return 0; }
3.push_heap()
push_heap()用於把數據插入到堆中,它也有三個參數,其意義與make_heap()的相同,第三個參數應與make_heap時的第三個參數保持一致。
在使用push_heap()前,請確保已經把數據通過q.push_back()傳入q中,而不是在push_heap()後再使用q.push_back(t)!!
例子:
#include<iostream> #include<vector> #include<algorithm> #include <queue> #include <functional> using namespace std; void display(vector<int>q) { for (int i = 0; i < q.size(); i++) { cout << q[i] << " "; } cout << endl; } int main(){ vector<int> q; for (int i = 0; i < 10; i++) { q.push_back(i); } make_heap(q.begin(), q.end(),less<int>()); cout << "插入前" << endl; display(q); q.push_back(12); push_heap(q.begin(), q.end(), less<int>()); cout << "插入後" << endl; display(q); return 0; }
4.sort_heap()
sort_heap()是將堆進行排序,排序後,序列將失去堆的特性(子節點的鍵值總是小於或大於它的父節點)。它也具有三個參數,參數意義與make_heap()相同,第三個參數應與make_heap時的第三個參數保持一致。大頂堆sort_heap()後是一個遞增序列,小頂堆是一個遞減序列。
請在使用這個函數前,確定序列符合堆的特性,否則會報錯!
#include<iostream> #include<vector> #include<algorithm> #include <queue> #include <functional> using namespace std; void display(vector<int>q) { for (int i = 0; i < q.size(); i++) { cout << q[i] << " "; } cout << endl; } int main(){ vector<int> q; for (int i = 0; i < 10; i++) { q.push_back(i); } make_heap(q.begin(), q.end(),less<int>()); cout << "sort前" << endl; display(q); sort_heap(q.begin(), q.end(), less<int>()); cout << "sort後" << endl; display(q); return 0; }
make_heap()等函數的用法