詳解C++模擬實現(xiàn)priority_queue(仿函數(shù))
優(yōu)先級隊列
優(yōu)先隊列是一種容器適配器,根據(jù)嚴格的弱排序標準,它的第一個元素總是它所包含的元素中最大的。類似于堆,在堆中可以隨時插入元素,并且只能檢索最大堆元素(優(yōu)先隊列中位于頂部的元素)
學習優(yōu)先級隊列時最主要的是仿函數(shù)的使用,如下less和greater
#include <vector> namespace QBL { template<class T>//仿函數(shù),本質就是運算符重載 class less { public: bool operator()(const T& x, const T& y) { return x < y; } }; template<class T> class greater { public: bool operator()(const T& x, const T& y) { return x > y; } }; //仿函數(shù)默認傳小于,則是大堆 //less這點庫里面也是和人的直覺是反著的,明明是less,卻是大堆 template<class T, class Container = vector<T>, class Compare = less<T>> class priority_queue { public: void adjust_up(size_t child) { int parent = (child - 1) / 2; while (child > 0) { //if (_con[child] > _con[parent]) //if (_con[parent] < _con[child]) if(Compare()(_con[parent], _con[child])) { swap(_con[child], _con[parent]); child = parent; parent = (child - 1) / 2; } else { break; } } } void adjust_down(size_t parent) { size_t child = parent * 2 + 1; while (child < _con.size()) { if (child + 1 < _con.size() && Compare()(_con[child], _con[child + 1])) ++child; //if (_con[child] > _con[parent]) if(Compare()(_con[parent], _con[child])) { swap(_con[child], _con[parent]); parent = child; child = parent * 2 + 1; } else { break; } } } void push(const T& val) { _con.push_back(val); adjust_up(_con.size() - 1); } void pop()//刪除堆頂 { swap(_con[0], _con[_con.size() - 1]); _con.pop_back(); adjust_down(0); } const T& top() { return _con[0]; } bool empty() { return _con.empty(); } size_t size() { return _con.size(); } private: Container _con; }; }
仿函數(shù)
仿函數(shù)本質就是一個類,其中重載了operator()
,我們可以根據(jù)我們的需要改變比較邏輯。
關于仿函數(shù)的使用,不僅僅局限于上面代碼的比較,還可以進行類的比較,不如日期類或者日期類的指針。如果比較日期類的指針就如下:
class ComparePDate { public: bool operator()(const Date* x, const Date* y) { return *x < *y; } };
通過上述代碼,即使優(yōu)先級隊列插入的是日期類的指針,同樣可以按照我們需要的大小輸出。
不僅僅是日期類,還有庫中的sort
函數(shù),傳參也可以傳仿函數(shù)類型
看手冊的描述可以發(fā)現(xiàn),我們需要傳我們需要的比較邏輯,sort會根據(jù)bool類型的返回確定仿函數(shù)的兩個參數(shù)哪一個排在前面。
用法如下:
struct goods { string _name;//名字 double _price;//價格 int _evaluate;//評價 goods(const char* str, double price, int evaluate) :_name(str) , _price(price) , _evaluate(evaluate) {} }; struct ComparePriceLess { bool operator()(const goods& gl, const goods& gr) { return gl._price < gr._price; } }; struct ComparePriceGreater { bool operator()(const goods& gl, const goods& gr) { return gl._price > gr._price; } }; struct CompareEvaluateLess { bool operator()(const goods& gl, const goods& gr) { return gl._evaluate < gr._evaluate; } }; struct CompareEvaluateGreater { bool operator()(const goods& gl, const goods& gr) { return gl._evaluate > gr._evaluate; } }; int main() { vector<goods> gs = { {"蘋果",3.1,5},{"香蕉",2.1,4} ,{"菠蘿",1.1,3} ,{"葡萄",4.1,2} }; sort(gs.begin(), gs.end(), ComparePriceLess());//將仿函數(shù)的匿名對象做參數(shù)傳入,就是我們的比較方式 sort(gs.begin(), gs.end(), ComparePriceGreater()); sort(gs.begin(), gs.end(), CompareEvaluateLess()); sort(gs.begin(), gs.end(), CompareEvaluateGreater()); return 0; }
到此這篇關于C++模擬實現(xiàn)priority_queue(仿函數(shù))的文章就介紹到這了,更多相關C++ priority_queue內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++?Protobuf實現(xiàn)接口參數(shù)自動校驗詳解
用C++做業(yè)務發(fā)開的同學是否還在不厭其煩的編寫大量if-else模塊來做接口參數(shù)校驗呢?今天,我們就模擬Java里面通過注解實現(xiàn)參數(shù)校驗的方式來針對C++?protobuf接口實現(xiàn)一個更加方便、快捷的參數(shù)校驗自動工具,希望對大家有所幫助2023-04-04C++ map 根據(jù)value找key的實現(xiàn)
今天小編就為大家分享一篇C++ map 根據(jù)value找key的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12項目之C++如何實現(xiàn)數(shù)據(jù)庫連接池
這篇文章主要介紹了項目之C++如何實現(xiàn)數(shù)據(jù)庫連接池問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03C++實現(xiàn)LeetCode(37.求解數(shù)獨)
這篇文章主要介紹了C++實現(xiàn)LeetCode(37.求解數(shù)獨),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07