1. 程式人生 > >make_heap()等函數的用法

make_heap()等函數的用法

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>
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>()); 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()等函數的用法