【演算法學習】STL庫 大小根堆的用法

Warddamn發表於2020-12-02

1.知識點:
①https://www.cnblogs.com/WindSun/p/11444446.html

②https://blog.csdn.net/fnzsjt/article/details/40118365

2.運用:
①https://blog.csdn.net/u013317445/article/details/89680330?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control

②https://xiaoneng.blog.csdn.net/article/details/103206628?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control

3.例子:
在這裡插入圖片描述
①思路:
先用一個最小堆存message的優先順序,再定義一個map容器存message和優先順序。當讀取到GET時,取出最小堆頂,然後在map中輸出這個堆頂為關鍵字的value即message

②程式碼:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
map<int,string> Messages;//用來儲存message和優先順序 

int main()
{
    vector<int> min;//最小堆底層容器 
    int t;
    string flag;
    cin>>t;
    while(t--){
    	cin>>flag;
    	if(flag=="PUT"){
    		string message;
    		int rank;
    		cin>>message>>rank;
    		min.push_back(rank);//在vector的末尾插入元素rank 
    		Messages[rank]=message;
    		push_heap(min.begin(),min.end(), greater<int>());//push_head函式先是讓end迭代器+1(因為vector多了一個元素),然後執行sifedown通過下溯維護最小堆 
		}
		if(flag=="GET"){
			if(min.size()==0)
			{
				cout<<"EMPTY QUEUE!"<<endl; 
			}
			else{
				int number=min[0];
				pop_heap(min.begin(),min.end(), greater<int>());//pop_heap把堆頂元素取出來,放到了ector容器的末尾,用原來的末尾元素去替代,然後end迭代器減1,執行siftdown()下溯函式來重新調整堆,此時不會算上末尾的那個元素,因為end減一了 
				min.pop_back();//這在底層vector資料容器中刪除最後一個元素,即上一步提出來的首元素 
				cout<<Messages[number]<<endl;
			}
		}
	}
    return 0;
}

相關文章