Aracılığıyla paylaş


priority_queue sınıfı

En büyük (veya en yüksek öncelikli) öğenin her zaman en üstte erişilebilir olduğu bir öğe koleksiyonunu koruyan kapsayıcı bağdaştırıcısı. Yeni öğeler ekleyebilir ve üst öğeyi kaldırabilir veya inceleyebilirsiniz, ancak koleksiyonun ortasındaki öğelere doğrudan erişemezsiniz.

Sözdizimi

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

Parametreler

Type
içinde priority_queuedepoacak öğe veri türü.

Container
için öğelerini depolayan temel kapsayıcının priority_queuetürü.

Compare
içinde göreli düzenlerini priority_queuebelirlemek için iki öğe değerini sıralama anahtarları olarak karşılaştıran bir işlev nesnesi sağlayan tür. Bu bağımsız değişken isteğe bağlıdır. İkili koşul less<typename Container::value_type> varsayılandır.

Açıklamalar

Bir priority_queue nesnenin ilk şablon parametresinde belirtilen sınıfın Type öğeleri ile eşdeğerdir value_type ve ikinci şablon parametresi tarafından belirtilen temel kapsayıcı sınıfındaki Container öğe türüyle eşleşmelidir. Type atanabilir olmalıdır; başka bir deyişle bu türdeki nesneleri kopyalayabilir ve bu türdeki değişkenlere değer atayabilirsiniz.

, priority_queue hangi öğelerin daha yüksek önceliğe sahip olduğunu belirlemek için bir karşılaştırma işlevi kullanır. Bu karşılaştırma işlevi sınıfının Traitsişlev nesnesidir. ile priority_queueçalışmak için öğelerinizin öğeleri sırayla düzenleyebilmesi için yalnızca less-than işlecini (<) kullanarak karşılaştırmayı desteklemesi gerekir.

tarafından priority_queuekullanılan temel kapsayıcı türünü değiştirebilirsiniz. Performans nedeniyle bunu yapmak isteyebilirsiniz. Öğeler bitişik depolamada depolandığından ve büyüdükçe daha az ayırma yaptığı için varsayılan vectordeğer olan , genellikle önbellek yerelliği için en iyisidir. Ancak çok büyük veya ilişkisiz kuyruklarınız olup olmadığını ve öğelerin taşınmasının pahalı olup olmadığını göz önünde bulundurabilirsiniz deque . Uygun temel kapsayıcı sınıfları hakkında daha fazla bilgi için bkz. container_type.

Her ikisinden priority_queue de öğe ekleme ve kaldırma işlemi logaritmik karmaşıklık içerir. içindeki priority_queue öğelere erişmenin karmaşıklığı süreklidir.

C++ Standart Kitaplığı, öğeleri depolamak priority_queueiçin kullanabileceğiniz diğer kapsayıcı bağdaştırıcılarını tanımlar: stack, queueve priority_queue:

  • Sınıfıstack, bir last-in, first-out (LIFO) veri yapısını destekler. Bir levha yığınını düşünün: Yalnızca temel kapsayıcının sonundaki son öğe olan yığının üst kısmından elemanlar (plakalar) ekleyebilir, inceleyebilir veya kaldırabilirsiniz.
  • Sınıfıqueue, ilk giriş, ilk çıkış (FIFO) veri yapısını destekler. Kişileri bir satırda düşünün. Satırın arkasına öğeler (kişiler) ekler ve bunları satırın önünden kaldırırsınız. Bir hattın hem ön hem de arka kısmı incelenebilir.
  • sınıfı priority_queue öğelerini sıralar, böylece en büyük öğe her zaman en üstte olur. Bir öğenin eklenmesini ve üst öğenin incelenmesini ve kaldırılmasını destekler.

Örnekler

Oluşturucular

Oluşturucu Açıklama
priority_queue priority_queue Boş olan veya bir temel kapsayıcı nesnesinin veya başka priority_queuebir öğesinin aralığının kopyası olan bir oluşturur.

Tür tanımları

Tür adı Açıklama
container_type Uyarlanan temel kapsayıcıyı priority_queue sağlayan bir tür.
size_type içindeki öğe sayısını temsil eden işaretsiz bir priority_queuetamsayı türü.
value_type içinde öğe olarak depolanan nesne türünü temsil eden bir priority_queuetür.

Üye işlevleri

Üye işlevi Açıklama
empty boş olup olmadığını sınar priority_queue .
pop öğesinin en büyük öğesini priority_queue üst konumdan kaldırır.
push öğesinden öğesinin önceliğine göre öncelik kuyruğuna bir öğe operator<ekler.
size içindeki priority_queueöğe sayısını döndürür.
top öğesinin en üstündeki priority_queueen büyük öğeye sabit bir başvuru döndürür.

Gereksinimler

Üstbilgi:<queue>

Ad alanı: std

priority_queue::container_type

Uyarlanacak temel kapsayıcıyı sağlayan bir tür.

typedef Container container_type;

Açıklamalar

türü, şablon parametresi Containeriçin bir eş anlamlıdır.

için priority_queue uygun temel kapsayıcı sınıfları Sınıf, varsayılan vector Sınıf veya , push_backve işlemlerini frontdestekleyen başka bir sıralı kapsayıcı ve pop_back rastgele erişim yineleyicisi içerirdeque. Kapsayıcı bağdaştırıcısı, temel kapsayıcı sınıfını kapsüller ve yalnızca sınırlı bir dizi kapsayıcı üyesi işlevlerini ortak arabirim olarak kullanıma sunar.

bildirme ve kullanma container_typeörneği için bkz. Özel kapsayıcıları ve karşılaştırıcıları kullanma

priority_queue::empty

boş priority_queue olup olmadığını sınar.

bool empty() const;

Dönüş Değeri

true priority_queue boşsa; falsepriority_queue yoksa.

Örnek: boş olup olmadığını priority_queue denetleyin

// 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

öğesinin en büyük öğesini priority_queue üst konumdan kaldırır.

void pop();

Açıklamalar

priority_queue bu üye işlevini kullanmak için nonempty olmalıdır. öğesinin priority_queue üstü her zaman kapsayıcıdaki en büyük öğeyi tutar.

Örnek: Pop öğeleri ve denetim boyutu

// 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 Boş olan veya bir aralığı bir temel kapsayıcı nesnesinden veya başka priority_queuebir öğesinden kopyalayan bir oluşturur.

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);

Parametreler

_comp
türündeki constTraits öğeleri priority_queuesıralamak için kullanılan ve varsayılan olarak temel kapsayıcının işlevini karşılaştırmak için kullanılan karşılaştırma işlevi.

_Cont
Oluşturulduğu temel kapsayıcı priority_queue bir kopya olacaktır.

right
priority_queue Bu kümenin bir kopyası olması gerekir.

first
Kopyalanacak öğe aralığındaki ilk öğenin konumu.

last
Kopyalanacak öğe aralığının ötesindeki ilk öğenin konumu.

Açıklamalar

İlk üç oluşturucunun her biri boş bir başlangıç priority_queuedeğeri belirtir, ikincisi de öğelerin sırasını belirlerken kullanılacak karşılaştırma işlevinin türünü (comp) ve kullanılacak (container_type) öğesini açıkça belirten üçüncü işlevi belirtir _Cont . anahtar sözcüğü explicit belirli türdeki otomatik tür dönüştürmelerini gizler.

Dördüncü oluşturucu, öğesinin priority_queue rightbir kopyasını belirtir.

Son üç oluşturucu, bazı kapsayıcıların aralığını [first, last) kopyalar ve sınıfın ve priority_queuekarşılaştırma işlevinin Traits türünü belirtirken açıklığı artan bir container_type şekilde başlatmak için değerlerini kullanır.

Örnek: Özel kapsayıcılar ve karşılaştırıcılar kullanma

// 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

öğesinden öğesinin önceliğine göre öncelik kuyruğuna bir öğe operator<ekler.

void push(const Type& val);

Parametreler

val
öğesinin en üstüne priority_queueeklenecek öğe.

Açıklamalar

öğesinin priority_queue üstü kapsayıcıdaki en büyük öğeyi içerir.

Örnek: Öğeleri gönderme ve üst kısımda okuma

// 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

içindeki priority_queueöğe sayısını döndürür.

size_type size() const;

Dönüş Değeri

geçerli uzunluğu priority_queue.

Örnek: öğesindeki öğe sayısını alma 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

içindeki öğe sayısını temsil eden işaretsiz bir priority_queuetamsayı türü.

typedef typename Container::size_type size_type;

Açıklamalar

Bu tür, uyarlanan temel kapsayıcının eş anlamlısıdır size_typepriority_queue .

Örnek: Üst öğeye erişme

bildirme ve kullanma size_typeörneği için bkz. Öğe sayısını alma

priority_queue::top

öğesinin en üstündeki priority_queueen büyük öğeye sabit bir başvuru döndürür.

const_reference top() const;

Dönüş Değeri

işlevinin nesnesi tarafından Traits belirlenen en büyük öğeye priority_queuebaşvuru.

Açıklamalar

priority_queue bu üye işlevini kullanmak için nonempty olmalıdır.

Örnek: Öğesinin en üst öğesini alma 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

içinde öğe olarak depolanan nesne türünü temsil eden bir priority_queuetür.

typedef typename Container::value_type value_type;

Açıklamalar

Bu tür, uyarlanan temel kapsayıcının eş anlamlısıdır value_typepriority_queue .

Örnek: priority_queue value_type diğer adını kullanma

// 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.

Örnek: Kullanıcı tanımlı veri türü kullanma

Kullanıcı tanımlı tür öğeleriyle kullanmak priority_queue için, öğeleri karşılaştırmak için bir yol sağlamanız gerekir. Türünüz için tanımlayabilir operator< veya özel bir karşılaştırma işlevi nesnesi sağlayabilirsiniz.

Aşağıdaki örnekte, nesneleri öncelik düzeyine göre sıralanmış olarak depolayan Task bir priority_queue gösterilmektedir. Daha yüksek öncelik değerlerine sahip görevler kuyruğun en üstünde yer alır.

// 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

Açıklamalar

Farklı bir sıralama istiyorsanız (örneğin, önce daha düşük değerler), özel bir karşılaştırıcı sağlayın:

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;

Ayrıca bkz.

C++ Standart Kitaplığında İş Parçacığı Güvenliği
C++ Standart Kitaplığı Başvurusu