模拟实现priority_queue优先级队列
生活随笔
收集整理的這篇文章主要介紹了
模拟实现priority_queue优先级队列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
優先級隊列
無參構造
priority_queue():c(){}區間構造
區間構造需要用到迭代器,而迭代器每個容器的類型不一樣,所以用模板給出,初始化列表,把用戶給進來的元素空間起始位置,放到優先級隊列中底層空間的位置,然后進行調整,把它調整成一個堆
template<class Iterator>priority_queue(Iterator first, Iterator last): c(first,last){//將c中的元素調整成堆的結構size_t count = c.size();//倒數第一個非葉子結點int root = (count - 2) / 2;for (; root >= 0; root--)AdjustDown(root);}元素操作
void push(const T& data){c.push_back(data);//插完元素后,破壞了堆的性質,重新調整AdjustUp(c.size() - 1);}void pop(){if (empty())return;swap(c.front(), c.back());c.pop_back();//重新調整AdjustDown(0);}size_t size()const{return c.size();}bool empty()const{return c.empty();}//堆頂元素不允許修改,因為堆頂元素修改可能會破壞堆的特性const T& top() const{return c.front();}向下調整和向上調整
參考下面這個鏈接里的內容
詳解堆的應用
如何判斷com中雙親放在前面還是孩子放在前面
默認按照less方式進行比較
less---->大堆------->大的元素往上提
雙親比孩子小,讓孩子往上走
bool operator()(const T& left ,const T& right) {return left < right; }大于的方式比較-------小堆
小于的方式比較-------大堆
完整代碼
#include<iostream> #include<algorithm> #include<vector> using namespace std;namespace bite {template<class T ,class Container = vector<T>,class Compare = less<T>>class priority_queue{public:priority_queue():c(){}template<class Iterator>priority_queue(Iterator first, Iterator last): c(first,last){//將c中的元素調整成堆的結構size_t count = c.size();//倒數第一個非葉子結點int root = (count - 2) / 2;for (; root >= 0; root--)AdjustDown(root);}void push(const T& data){c.push_back(data);AdjustUp(c.size() - 1);}void pop(){if (empty())return;swap(c.front(), c.back());c.pop_back();AdjustDown(0);}size_t size()const{return c.size();}bool empty()const{return c.empty();}//堆頂元素不允許修改,因為堆頂元素修改可能會破壞堆的特性const T& top() const{return c.front();}private:void AdjustDown(int parent){int child = parent * 2 + 1;while (child < c.size()){//找以parent為根的兩個孩子中較大的孩子if (child + 1 < c.size() && com(c[child], c[child + 1]))child += 1;//檢測雙親是否滿足情況if (com(c[parent] , c[child])){swap(c[child], c[parent]);parent = child;child = parent * 2 + 1;}elsereturn;}}void AdjustUp(int child){int parent = (child - 1) / 2;while (child){if (com(c[parent] , c[child])){swap(c[child], c[parent]);child = parent;parent = (child - 1) / 2;}else{return;}}}private:Container c; //存儲方式Compare com; //比較方式};}測試
int main() {int array[] = { 8, 1, 9, 3, 6, 4, 5, 0, 2, 7 };bite::priority_queue<int>q(array, array + sizeof(array) / sizeof(array[0]));cout << q.top() << endl;system("pause");return 0; }總結
以上是生活随笔為你收集整理的模拟实现priority_queue优先级队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样能治好无精症
- 下一篇: 详解malloc,calloc,real