STL priority queue 常見用法詳解

2022-09-14 06:27:09 字數 3002 閱讀 2087

《演算法筆記》學習筆記

//priority_queue又稱優先佇列,其底層時用堆來實現的。

//在優先佇列中,隊首元素一定是當前佇列中優先順序最高的那乙個。

桃子(優先順序 3)

梨子(優先順序 4)

蘋果(優先順序 1)

//那麼出隊順序是:梨子(4) -> 桃子(3) -> 蘋果(1)

//可以在任何時候往優先佇列裡面加入(push)元素,而優先佇列底層的資料結構對(heap)

//會隨時調整結構,使得每次的隊首元素都是優先順序最大的

//定義

priority_queue< typename > name;

//只能通過top()函式來訪問隊首元素(也稱堆頂元素),也就是優先順序最高的元素

#include #include using namespace std;

int main()

(1) push()

//push(x)將令x入隊,時間複雜度為o(logn),其中n為當前優先佇列中的元素個數。
(2) top()

//top()可以獲得隊首元素,時間複雜度為o(1)

//使用top()函式之前,必須用empty()判斷優先佇列是否為空

(3) pop()

//pop()令隊首元素出隊,時間複雜度為o(logn),其中n為當前優先佇列中的元素個數

#include #include using namespace std;

int main()

(4) empty()

//empty()檢測優先佇列是否為空,返回true則空,返回false則非空。時間複雜度為o(1)

#include #include using namespace std;

int main() else

q.push(1);

if(q.empty() == true) else

return 0;

}

(5) size()

//size()返回優先佇列內元素的個數,時間複雜度為o(1)

#include #include using namespace std;

int main()

(1) 基本資料型別的優先順序設定

//基本資料型別就是int型, double型, char型等可以直接使用的資料型別

//優先佇列對他們的優先順序設定一般是數字大的優先順序越高

//因此隊首元素就是優先佇列內元素最大的那個(如果是char型,則是字典序最大的)

//下面兩種優先佇列的定義是等價的(以int型為例,注意最後兩個》之間有乙個空格):

priority_queueq;

priority_queue, less> q;

//第二種定義方式的尖括號內多出兩個引數:vector, less//其中vector填寫的是來承載底層資料結構堆(heap)的容器

//如果第乙個引數是double型或char型,則此處只需要填寫vector或vector則是對第乙個引數的比較類。

//less表示數字大的優先順序越大,而greater表示數字小優先順序越大

//優先佇列總數把最小的元素放在隊首,定義

priority_queue, greater>q;

//示例

#include #include using namespace std;

int main()

(2) 結構體的優先順序設定

//對水果的名稱和**建立結構體

struct fruit ;

//現在希望水果的**高的為優先順序高,就需要過載(overload)小於"<"。

//過載是指對已有的運算子進行重新定義,也就是說,可以改變小於號的功能。

struct fruit

};//fruit結構體種增加了乙個函式,其中"friend"為友元。

//想要以**低的水果為優先順序高,只需要把return中的小於號改為大於號即可。

struct fruit

};//示例:

#include #include #include using namespace std;

struct fruit

}f1, f2, f3;

int main()

//優先佇列的這個函式與sort中的cmp函式的效果是相反的

//上面的函式有沒有辦法同sort中的cmp函式那樣解除安裝結構體外面

//方法:把friend去掉,把小於號改成一對小括號,然後把過載的函式寫在結構體外面

//同時將其用struct包裝起來

struct cmp

}//這種情況需要使用第二種定義方法來定義優先佇列

priority_queue, cmp> q;

//把greater<>部分換成cmp

#include #include #include using namespace std;

struct fruit f1, f2, f3;

struct cmp

};int main()

//即使是基本資料型別或者其他stl容器(例如set),也可以通過同樣的方式來定義優先順序

//建議使用引用來提高效率,在比較類的引數種需要加上"const" 和"&"

friend bool operator < (const fruit &f1, const fruit &f2)

bool operator () (const fruit &f1, const fruit &f2)

nginx limit req zone用法詳解

nginx可以使用ngx http limit req module模組的limit req zone指令進行限流訪問,防止使用者惡意攻擊刷爆伺服器。ngx http limit req module模組是nginx預設安裝的,所以直接配置即可。首先,在nginx.conf檔案中的http模組下配置...

mysql 常見用法 mysql常見用法

檢視慢日誌 show variables like slow query log show variables like long query time 設定慢日誌記錄什麼樣的sql,預設10s log queries not using indexes 未使用索引的查詢也被記錄到慢查詢日誌中,一般...

優先佇列priority queue 用法詳解

優先佇列是佇列的一種,不過它可以按照自定義的一種方式 資料的優先順序 來對佇列中的資料進行動態的排序 每次的push和pop操作,佇列都會動態的調整,以達到我們預期的方式來儲存。例如 我們常用的操作就是對資料排序,優先佇列預設的是資料大的優先順序高 所以我們無論按照什麼順序push一堆數,最終在佇列...