priority_queue 容器

priority_queue 容器適配器模擬的也是隊列這種存儲結構,即使用此容器適配器存儲元素只能“從一端進(稱爲隊尾),從另一端出(稱爲隊頭)”,且每次只能訪問 priority_queue 中位於隊頭的元素。

但是,priority_queue 容器適配器中元素的存和取,遵循的並不是 “First in,First out”(先入先出)原則,而是“First in,Largest out”原則。直白的翻譯,指的就是先進隊列的元素並不一定先出隊列,而是優先級最大的元素最先出隊列。

那麼,priority_queue 容器適配器中存儲的元素,優先級是如何評定的呢?很簡單,每個 priority_queue 容器適配器在創建時,都制定了一種排序規則。根據此規則,該容器適配器中存儲的元素就有了優先級高低之分。

舉個例子,假設當前有一個 priority_queue 容器適配器,其制定的排序規則是按照元素值從大到小進行排序。根據此規則,自然是 priority_queue 中值最大的元素的優先級最高。

priority_queue 容器適配器爲了保證每次從隊頭移除的都是當前優先級最高的元素,每當有新元素進入,它都會根據既定的排序規則找到優先級最高的元素,並將其移動到隊列的隊頭;同樣,當 priority_queue 從隊頭移除出一個元素之後,它也會再找到當前優先級最高的元素,並將其移動到隊頭。

基於 priority_queue 的這種特性,因此該容器適配器有被稱爲優先級隊列。

創建priority_queue的幾種方式

1) 創建一個空的 priority_queue 容器適配器,第底層採用默認的 vector 容器,排序方式也採用默認的 std::less<T> 方法:

std::priority_queue<int> values;

2) 可以使用普通數組或其它容器中指定範圍內的數據,對 priority_queue 容器適配器進行初始化:

//使用普通數組
int values[]{4,1,3,2};
std::priority_queue<int>copy_values(values,values+4);//{4,2,3,1}
//使用序列式容器
std::array<int,4>values{ 4,1,3,2 };
std::priority_queue<int>copy_values(values.begin(),values.end());//{4,2,3,1}

3) 還可以手動指定 priority_queue 使用的底層容器以及排序規則,比如:

int values[]{ 4,1,2,3 };
std::priority_queue<int, std::deque<int>, std::greater<int> >copy_values(values, values+4);//{1,3,2,4}

priority_queue提供的成員函數

成員函數 功能
empty() 如果 priority_queue 爲空的話,返回 true;反之,返回 false。
size() 返回 priority_queue 中存儲元素的個數。
top() 返回 priority_queue 中第一個元素的引用形式。
push(const T& obj) 根據既定的排序規則,將元素 obj 的副本存儲到 priority_queue 中適當的位置。
push(T&& obj) 根據既定的排序規則,將元素 obj 移動存儲到 priority_queue 中適當的位置。
emplace(Args&&... args) Args&&... args 表示構造一個存儲類型的元素所需要的數據(對於類對象來說,可能需要多個數據構造出一個對象)。此函數的功能是根據既定的排序規則,在容器適配器適當的位置直接生成該新元素。
pop() 移除 priority_queue 容器適配器中第一個元素。
swap(priority_queue<T>& other) 將兩個 priority_queue 容器適配器中的元素進行互換,需要注意的是,進行互換的 2 個 priority_queue 容器適配器中存儲的元素類型以及底層採用的基礎容器類型,都必須相同。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章