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 容器適配器中存儲的元素類型以及底層採用的基礎容器類型,都必須相同。 |