共用方式為


priority_queue 類別

一個容器適配器,維持一組元素,其中最大(或最高優先權)元素總是在頂端可存取。 你可以新增元素並移除或檢視頂端元素,但無法直接存取集合中間的元素。

語法

template <class Type, class Container= vector <Type>, class Compare= less <typename Container ::value_type>>
class priority_queue

參數

Type
要儲存在 priority_queue.

Container
儲存 元素 priority_queue的底層容器類型。

Compare
提供一個函式物件,將兩個元素值作為排序鍵比較,以決定它們在 中的 priority_queue相對順序。 此引數是選擇性的。 二元謂詞 less<typename Container::value_type> 是預設條件。

備註

物件第一個範本參數priority_queue中指定的類別Type元素,等價value_type且必須與第二個範本參數所指定的底層容器類別Container中的元素類型相符。 必須 Type 是可指派的,也就是說你可以複製該類型的物件,並將值指派給該類型的變數。

該會 priority_queue 使用比較函數來判斷哪些元素優先權較高。 此比較函數是類別 Traits的函數物件。 要處理 priority_queue,你的元素只需支援使用小於算子(<)來比較,以便能將元素排列順序排列。

你可以更改 priority_queue. 你可能想這麼做,出於效能考量。 預設 vector的 通常是快取區域性的最佳選擇,因為元素會儲存在連續的儲存中,且隨著擴充,配置次數會減少。 但你或許會考慮 deque ,如果你的隊列非常大或無界,且移動元素會很昂貴。 欲了解更多適合底層容器類別的資訊,請參見 container_type

兩者的元素加減 priority_queue 具有對數級複雜度。 存取 priority_queue 中的項目具有常數複雜度。

C++ 標準函式庫定義了其他容器適配器,你可以用來儲存元素:priority_queuestackqueuepriority_queue和 :

  • 類別stack支持最後一個先出 (LIFO) 資料結構。 想像一堆盤子:你只能從堆疊的頂端(底部容器末端)插入、檢查或移除元件(板子)。
  • 類別queue支援先進先出 (FIFO) 數據結構。 想像排成一列的人。 你先把元素(人)加到隊伍的後面,然後把他們從隊伍的前面移除。 管線的正反兩端都可以被檢查。
  • priority_queue 類別對其元素排序,使得最大元素總是在最上方。 它支援插入項目,以及檢查和移除頂端項目。

範例

建構函式

建構函式 描述
priority_queue 建構 priority_queue,它可以是空的,或是基底容器物件範圍的複本,或是其他 priority_queue 的複本。

Typedefs

類型名稱 描述
container_type 一種提供基礎容器並使其 priority_queue 適應的類型。
size_type 不帶正負號的整數類型,可以表示 priority_queue 中的項目數。
value_type 此類型代表儲存為 priority_queue 項目的物件類型。

成員函式

成員函數 描述
empty 測試 priority_queue 是否為空白。
pop 從頂端位置移除 priority_queue 的最大項目。
push 根據專案的 operator<優先順序,將專案加入至優先順序佇列。
size 傳回 priority_queue 中項目的數目。
top 傳回 priority_queue 頂端最大項目的 const 參考。

需求

標頭:<queue>

命名空間std

priority_queue::container_type

提供要配接之基底容器的類型。

typedef Container container_type;

備註

此類型是範本參數 Container的同義字。

適合的priority_queue底層容器類別包括 deque Class(預設vector類別),或任何支援 、 push_backpop_back 及 的操作front的序列容器,以及隨機存取迭代器。 容器適配器封裝底層容器類別,並僅以公開介面形式暴露有限的序列容器成員函式。

關於如何宣告與使用的container_type範例,請參見「使用自訂容器與比較器

priority_queue::empty

測試 priority_queue 是否為空白。

bool empty() const;

傳回值

true 如果 是空的 priority_queue ,則為 , false 如果 為空,則 priority_queue 為 。

範例:檢查 是否 priority_queue 為空

// compile with: /EHsc
#include <queue>
#include <iostream>

int main()
{
   using namespace std;

   // Declares priority_queues with default deque base container
   priority_queue <int> q1, s2;

   q1.push(1);

   if (q1.empty())
      cout << "The priority_queue q1 is empty." << endl;
   else
      cout << "The priority_queue q1 is not empty." << endl;

   if (s2.empty())
      cout << "The priority_queue s2 is empty." << endl;
   else
      cout << "The priority_queue s2 is not empty." << endl;
}
The priority_queue q1 is not empty.
The priority_queue s2 is empty.

priority_queue::pop

從頂端位置移除 priority_queue 的最大項目。

void pop();

備註

使用 必須 priority_queue 是非空的,才能使用此成員函式。 容器 priority_queue 頂部總是裝著容器中最大的元素。

範例:彈跳元素與檢查尺寸

// compile with: /EHsc
#include <queue>
#include <iostream>

int main()
{
   using namespace std;
   priority_queue <int> q1, s2;

   q1.push(10);
   q1.push(20);
   q1.push(30);

   priority_queue <int>::size_type i, iii;
   i = q1.size();
   cout << "The priority_queue length is " << i << "." << endl;

   const int& ii = q1.top();
   cout << "The element at the top of the priority_queue is " << ii << "." << endl;

   q1.pop();

   iii = q1.size();
   cout << "After a pop, the priority_queue length is " << iii << "." << endl;

   const int& iv = q1.top();
   cout << "After a pop, the element at the top of the " << "priority_queue is " << iv << "." << endl;
}
The priority_queue length is 3.
The element at the top of the priority_queue is 30.
After a pop, the priority_queue length is 2.
After a pop, the element at the top of the priority_queue is 20.

priority_queue::priority_queue

建立 priority_queue 一個空的 ,或是從基底容器物件 priority_queue或其他物件複製一個範圍。

priority_queue();

explicit priority_queue(const Traits& _comp);

priority_queue(const Traits& _comp, const container_type& _Cont);

priority_queue(const priority_queue& right);

template <class InputIterator>
priority_queue(InputIterator first, InputIterator last);

template <class InputIterator>
priority_queue(InputIterator first, InputIterator last, const Traits& _comp);

template <class InputIterator>
priority_queue(InputIterator first, InputIterator last, const Traits& _comp, const container_type& _Cont);

參數

_comp
型別的 constTraits 比較函式,用來排序 中的 priority_queue專案,預設為比較基底容器的函式。

_Cont
建構 priority_queue 的基底容器是複本。

right
priority_queue建構集為複本的 。

first
要複製的元素範圍中第一個元素的位置。

last
超出要複製之元素範圍的第一個元素的位置。

備註

前三個建構函式中的每一個都會指定空的初始 priority_queue,第二個建構函式也會指定要用於建立元素順序的比較函comp式類型,以及第三個明確指定 container_type 要使用的 (_Cont)。 關鍵字 explicit 會隱藏某些類型的自動類型轉換。

第四個建構函式會指定的 priority_queue right複本。

最後三個建構函式會複製一些容器的範圍 [first, last) ,並使用 值來初始化 priority_queue ,並在指定 類別 Traitscontainer_type的比較函式類型時越來越明確。

範例:使用自訂容器和比較器

// compile with: /EHsc
#include <queue>
#include <vector>
#include <deque>
#include <list>
#include <iostream>

int main()
{
   using namespace std;

   // Declares a priority_queue with a default vector base container
   priority_queue <int> q1;
   cout << "q1 = ( ";
   while (!q1.empty())
   {
      cout << q1.top() << " ";
      q1.pop();
   }
   cout << ")" << endl;

   // Declares a priority_queue with nondefault deque base container
   priority_queue <int, deque <int>> q2;
   q2.push(5);
   q2.push(15);
   q2.push(10);
   cout << "q2 = ( ";
   while (!q2.empty())
   {
      cout << q2.top() << " ";
      q2.pop();
   }
   cout << ")" << endl;
   cout << "After printing, q2 has " << q2.size() << " elements." << endl;

   // Declares a priority_queue with a vector base container and specifies that
   // the comparison function greater is to be used for ordering elements
   priority_queue <int, vector<int>, greater<int>> q3;
   q3.push(2);
   q3.push(1);
   q3.push(3);
   cout << "q3 = ( ";
   
   while (!q3.empty())
   {
      cout << q3.top() << " ";
      q3.pop();
   }
   cout << ")" << endl;

   // Declares a priority_queue and initializes it with elements copied from another
   // container by first inserting elements into q1 and then copying q1 elements into q4
   q1.push(100);
   q1.push(200);
   priority_queue <int> q4(q1);
   cout << "q4 = ( ";
   while (!q4.empty())
   {
      cout << q4.top() << " ";
      q4.pop();
   }
   cout << ")" << endl;

   // Creates an auxiliary vector object v5 to be used to initialize q5
   vector <int> v5;
   vector <int>::iterator v5_Iter;
   v5.push_back(10);
   v5.push_back(30);
   v5.push_back(20);
   cout << "v5 = ( " ;
   for (v5_Iter = v5.begin() ; v5_Iter != v5.end() ; v5_Iter++)
   {
      cout << *v5_Iter << " ";
   }
   cout << ")" << endl;

   // Declares and initializes a priority_queue q5 by copying the
   // range v5[ first,  last) from vector v5
   priority_queue <int> q5(v5.begin(), v5.begin() + 2);
   cout << "q5 = ( ";
   while (!q5.empty())
   {
      cout << q5.top() << " ";
      q5.pop();
   }
   cout << ")" << endl;

   // Declares a priority_queue q6 with a comparison function greater and
   // initializes q6 by copying the range v5[ first,  last) from vector v5
   priority_queue <int, vector<int>, greater<int>> q6(v5.begin(), v5.begin() + 2);
   cout << "q6 = ( ";
   while (!q6.empty())
   {
      cout << q6.top() << " ";
      q6.pop();
   }
   cout << ")" << endl;
}

priority_queue::push

根據專案的 operator<優先順序,將專案加入至優先順序佇列。

void push(const Type& val);

參數

val
要加到 priority_queue的元素。

備註

容器 priority_queue 頂部包含容器中最大的元素。

舉例:Push 元素並閱讀頂部

// compile with: /EHsc
#include <queue>
#include <iostream>

int main()
{
   using namespace std;
   priority_queue<int> q1;

   q1.push(10);
   q1.push(30);
   q1.push(20);

   priority_queue<int>::size_type i;
   i = q1.size();
   cout << "The priority_queue length is " << i << "." << endl;

   const int& ii = q1.top();
   cout << "The element at the top of the priority_queue is " << ii << "." << endl;
}
The priority_queue length is 3.
The element at the top of the priority_queue is 30.

priority_queue::size

傳回 priority_queue 中項目的數目。

size_type size() const;

傳回值

的目前長度 priority_queue

範例:取得 元素數量 priority_queue

// compile with: /EHsc
#include <queue>
#include <iostream>

int main()
{
   using namespace std;
   priority_queue <int> q1, q2;
   priority_queue <int>::size_type i;

   q1.push(1);
   i = q1.size();
   cout << "The priority_queue length is " << i << "." << endl;

   q1.push(2);
   i = q1.size();
   cout << "The priority_queue length is now " << i << "." << endl;
}
The priority_queue length is 1.
The priority_queue length is now 2.

priority_queue::size_type

一個無符號整數型別,代表 中 priority_queue元素的數量。

typedef typename Container::size_type size_type;

備註

這種類型是其所適應的基礎容器priority_queuesize_type同義詞。

範例:存取頂層元素

關於如何宣告與使用 size_type的範例,請參見「取得元素數量

priority_queue::top

傳回 priority_queue 頂端最大項目的 const 參考。

const_reference top() const;

傳回值

由函式所Traitspriority_queue決定之最大項目的參考。

備註

使用 必須 priority_queue 是非空的,才能使用此成員函式。

範例:取得 priority_queue

// compile with: /EHsc
#include <queue>
#include <iostream>

int main()
{
   using namespace std;
   priority_queue<int> q1;

   q1.push(10);
   q1.push(30);
   q1.push(20);

   priority_queue<int>::size_type i;
   i = q1.size();
   cout << "The priority_queue length is " << i << "." << endl;

   const int& ii = q1.top();
   cout << "The element at the top of the priority_queue is " << ii << "." << endl;
}
The priority_queue length is 3.
The element at the top of the priority_queue is 30.

priority_queue::value_type

此類型代表儲存為 priority_queue 項目的物件類型。

typedef typename Container::value_type value_type;

備註

這種類型是其所適應的基礎容器priority_queuevalue_type同義詞。

範例:使用 priority_queue value_type 別名

// compile with: /EHsc
#include <queue>
#include <iostream>

int main()
{
   using namespace std;

   // Declares priority_queues with default deque base container
   priority_queue<int>::value_type AnInt;

   AnInt = 69;
   cout << "The value_type is AnInt = " << AnInt << endl;

   priority_queue<int> q1;
   q1.push(AnInt);
   cout << "The element at the top of the priority_queue is " << q1.top() << "." << endl;
}
The value_type is AnInt = 69
The element at the top of the priority_queue is 69.

範例:使用使用者定義的資料型別

若要搭配使用者定義的類型元素使用 priority_queue ,您必須提供比較元素的方式。 你可以為你的型別定義 operator< ,或提供自訂的比較函數物件。

以下範例展示了 priority_queue 一個依 Task 優先順序儲存物件的 。 優先權較高的任務會排在隊列頂端。

// compile with: /EHsc
#include <queue>
#include <iostream>
#include <string>

struct Task
{
    int priority;
    std::string name;

    // Define operator< for priority_queue ordering
    // Returns true if this task has LOWER priority than other
    // (priority_queue puts the "largest" element at the top)
    bool operator<(const Task& other) const
    {
        return priority < other.priority;
    }
};

int main()
{
    std::priority_queue<Task> tasks;

    tasks.push({3, "Low priority task"});
    tasks.push({10, "High priority task"});
    tasks.push({5, "Medium priority task"});

    std::cout << "Processing tasks by priority:\n";
    while (!tasks.empty())
    {
        const Task& t = tasks.top();
        std::cout << "  Priority " << t.priority << ": " << t.name << "\n";
        tasks.pop();
    }
}
Processing tasks by priority:
  Priority 10: High priority task
  Priority 5: Medium priority task
  Priority 3: Low priority task

備註

如果你想要不同的排序(例如先降低數值),可以提供自訂比較器:

struct ComparePriority
{
    bool operator()(const Task& a, const Task& b)
    {
        return a.priority > b.priority; // Lower priority value means higher priority
    }
};

std::priority_queue<Task, std::vector<Task>, ComparePriority> minQueue;

另請參閱

C++ 標準程式庫中的執行緒安全
C++ 標準程式庫參考