1. 程式人生 > >C++ STL 優先佇列 (priority_queue)

C++ STL 優先佇列 (priority_queue)

##`std::priority_queue` `` ###優先佇列   優先佇列是一種容器介面卡,根據某些嚴格的**弱排序**標準,使其第一個元素始終包含的最大元素。   這種特性類似於堆,它可以在其中隨時插入元素,並且只能檢索最大堆元素(即優先順序佇列頂部的元素)。   優先佇列內部的實現需要依賴`基礎容器`,該容器應可通過隨機訪問`[i]`和迭代器`Iterator`訪問,並需要支援以下操作 * `empty( )` * `size( )` * `front( )` * `push_back( )` * `pop_back( ) `      顯而易見的是有`deque`和`vector`這兩個基礎容器支援以上操作      所以在預設情況下,如果未為`priority_queue`指定基礎容器類,則將使用`vector`。 ###成員函式 | (constructor) | Construct priority queue (public member function ) | | ---------------------------------------------------------------- | ------ | | empty | 優先佇列是否為空 | | size | 返回優先佇列的當前元素個數 | | top | 訪問頂部元素(返回頂部元素的常量引用) | | push | 插入一個元素 | | pop | 刪除頂部元素 | | emplace | 構造並插入一個元素 | | void swap (priority_queue& x) | 交換兩個佇列的內容 | >注: 1、emplace 與 push 相比更加優化了對記憶體空間的使用,具體可以另行查詢 2、swap 是交換兩個同一型別的優先佇列內的所有元素,如 `a.swap ( x )` 即交換佇列 a 和 x 的所有元素 ###構造優先佇列 ``` /* 1 */ priority_queue pq1; //預設大根堆且預設基礎容器為vector /* 2 */ priority_queue, less > pq2; //與 1 的性質一模一樣 /* 3 */ priority_queue, greater > pq3; //小根堆且基礎容器為deque ``` >**注意:**大根堆為`less`,小根堆為`greater`。 ###函式成員用例 ####1、push、top、empty、pop、大根堆 #####(1)int ``` #include #include using namespace std; int main ( void ) { priority_queue pq; //大根堆,預設降序(大的在前,小的在後) pq.push ( 60 ); pq.push ( 20 ); pq.push ( 40 ); pq.push ( 1 ); pq.push ( 25 ); while ( !pq.empty() ) // pq不為空則迴圈 { cout << pq.top() << " "; //新增新元素 pq.pop(); //彈出頭元素 } return 0; } ``` ![](https://img2020.cnblogs.com/blog/2283267/202101/2283267-20210121191208103-2092504560.png)
#####(2)string ``` #include #include using namespace std; int main ( void ) { priority_queue pq; //大根堆,預設降序(大的在前,小的在後) pq.push ( "abc" ); pq.push ( "abd" ); pq.push ( "acd" ); pq.push ( "cda" ); pq.push ( "abcd" ); while ( !pq.empty() ) // pq不為空則迴圈 { cout << pq.top() << endl; //新增新元素 pq.pop(); //彈出頭元素 } return 0; } ``` >
輸出按字典序
![](https://img2020.cnblogs.com/blog/2283267/202101/2283267-20210121194914377-1650712079.png) ####2、swap、emplace、小根堆 ``` #include #include using namespace std; int main ( void ) { priority_queue, greater > pq1; //小根堆,預設降序(小的在前,大的在後) pq1.emplace ( 5 ); pq1.emplace ( 4 ); pq1.emplace ( 3 ); pq1.emplace ( 2 ); pq1.emplace ( 1 ); priority_queue, greater > pq2; pq2.emplace ( 5 * 2 ); pq2.emplace ( 4 * 2 ); pq2.emplace ( 3 * 2 ); pq2.emplace ( 2 * 2 ); pq2.emplace ( 1 * 2 ); cout << "pq1:" << endl; while ( !pq1.empty() ) // pq不為空則迴圈 { cout << pq1.top() << " "; //新增新元素 pq1.pop(); //彈出頭元素 } cout << endl << "pq2:" << endl; while ( !pq2.empty() ) // pq不為空則迴圈 { cout << pq2.top() << " "; //新增新元素 pq2.pop(); //彈出頭元素 } cout << endl; return 0; } ``` ![](https://img2020.cnblogs.com/blog/2283267/202101/2283267-20210121200313755-4533548