普通的佇列是一種先進先出的資料結構,元素在佇列尾追加,而從佇列頭刪除。在優先佇列中,元素被賦予優先順序。當訪問元素時,具有最高優先順序的元素最先刪除。優先佇列具有最高端先出 (first in, largest out)的行為特徵。通常採用堆資料結構來實現。
stl中的優先佇列priority_queue,包含在標頭檔案」queue」中,可以使用具有預設優先順序的已有資料結構;也可以再定義優先佇列的時候傳入自定義的優先順序比較物件;或者使用自定義物件(資料結構),但是必須過載好< 操作符。
定義:priority_queue
type 就是資料型別,container 就是容器型別(container必須是用陣列實現的容器,比如vector,deque等等,但不能用 list。stl裡面預設用的是vector),functional 就是比較的方式,當需要用自定義的資料型別時才需要傳入這三個引數,使用基本資料型別時,只需要傳入資料型別,預設是大頂堆
一般是:
//公升序佇列
priority_queue <
int,vector<
int>
,greater<
int>
> q;
//降序佇列
priority_queue <
int,vector<
int>
,less<
int>
>q;
//greater和less是std實現的兩個仿函式(就是使乙個類的使用看上去像乙個函式。其實現就是類中實現乙個operator(),這個類就有了類似函式的行為,就是乙個仿函式類了)
q.
empty
() 如果隊列為空,則返回true,否則返回false
q.size
() 返回佇列中元素的個數
q.pop(
) 刪除隊首元素,但不返回其值
q.top(
) 返回具有最高優先順序的元素值,但不刪除該元素
q.push
(item) 在基於優先順序的適當位置插入新元素
其中q.top()為查詢操作,在最小優先佇列中搜尋優先權最小的元素,在最大優先佇列中搜尋優先權最大的元素。q.pop()為刪除該元素。優先佇列插入和刪除元素的複雜度都是o(lgn),所以速度很快;另外,在優先佇列中,元素可以具有相同的優先權。
①預設優先順序:
通過《操作符可知在整數中元素大的優先順序高。
③傳入比較結構體,自定義優先順序。
#include
using
namespace std;
struct cmp};
/**struct cmp
priority_queue q;
//優先佇列的研究2:資料結構的優先佇列方法
#include
#include
using
namespace std;
struct time
else
return t1.minute}else
return t1.hour}//最終的效果會是乙個大根堆 };
/*第二種過載方法,結構體外過載比較函式
struct cmp
while
(!q.
empty()
)return0;
}
**示例
#include
#include
#include
#include
#include
using
namespace std;
struct cmp1};
struct node};
priority_queue<
int, vector<
int>
,cmp1>q2;
priority_queueq3;
intmain()
cout<
while
(!q3.
empty()
)return0;
}
1.基本例子:
#include
#include
using
namespace std;
intmain()
while
(!a.
empty()
) cout <
< endl;
while
(!c.
empty()
) cout <
< endl;
b.push
("abc");
b.push
("abcd");
b.push
("cbd");
while
(!b.
empty()
) cout <
< endl;
return0;
}
輸出
4 3 2 1 0
0 1 2 3 4
cbd abcd abc
2.pari的比較,先比較第乙個元素,第乙個相等比較第二個
#include
#include
#include
using
namespace std;
intmain()
}
3.對於自定義型別
#include
#include
using
namespace std;
//方法1
struct tmp1 //運算子過載<
bool
operator
<
(const tmp1& a)
const};
//方法2
struct tmp2 //重寫仿函式};
intmain()
cout <
< endl;
priority_queue
, tmp2> f;
f.push
(c);
f.push
(b);
f.push
(a);
while
(!f.
empty()
)}
321
321
STL容器 優先佇列priority queue
priority queue顧名思義,是乙個具有權值概念的queue,它和queue一樣允許加入新元素 移除舊元素等功能。由於這是乙個queue,所以只允許在底部加入元素,從頂部取出元素。但優先佇列帶有權值概念,其內的元素自動按照元素的權值排序。權值最高者排在最前面。stl的priority que...
STL初步 優先佇列Priority queue
這個優先到底是如何優先?和普通佇列區別在哪?priority queue type,container,functional priority queue,less q priority queue,less a q priority queue,less b 優先佇列中沒有迭代器 也沒有clear...
優先順序佇列用法詳解(priority queue)
由於優先順序佇列的內部資料結構為堆,所以這裡先介紹堆的一些操作。堆的一些函式操作在algorithm標頭檔案中 在 first,last 範圍內 構造最大堆,first,last 可以是vector指標也可以是陣列指標 make heap first last make heap first las...