priority_queue
Klasa
Klasa adaptera kontenera szablonu, która zapewnia ograniczenie funkcjonalności ograniczające dostęp do najwyższego elementu podstawowego typu kontenera, który jest zawsze największym lub najwyższym priorytetem. Nowe elementy można dodać do elementu priority_queue
, a górny element priority_queue
elementu można sprawdzić lub usunąć.
Składnia
template <class Type, class Container= vector <Type>, class Compare= less <typename Container ::value_type>>
class priority_queue
Parametry
Type
Typ danych elementu, który ma być przechowywany w obiekcie priority_queue
.
Container
Typ kontenera bazowego używanego do implementowania elementu priority_queue
.
Compare
Typ, który udostępnia obiekt funkcji, który może porównać dwie wartości elementu jako klucze sortowania, aby określić ich względną kolejność w obiekcie priority_queue
. Ten argument jest opcjonalny, a predykat less<typename Container::value_type>
binarny jest wartością domyślną.
Uwagi
Elementy klasy określone w pierwszym parametrze szablonu obiektu kolejki są synonimami value_type
i muszą odpowiadać typowi elementu w podstawowej klasie Type
Container
kontenera określonej przez drugi parametr szablonu. Element Type
musi być przypisywany, aby można było skopiować obiekty tego typu i przypisać wartości do zmiennych tego typu.
Kolejność priority_queue
steruje sekwencją przez wywołanie przechowywanego obiektu funkcji klasy Traits
. Ogólnie rzecz biorąc, elementy muszą być jedynie mniej niż porównywalne do ustalenia tej kolejności: tak aby, biorąc pod uwagę dwa elementy, można określić, że są one równoważne (w sensie, że ani nie jest mniejszy niż drugi) lub że jeden jest mniejszy niż drugi. Skutkuje to ustaleniem kolejności dla elementów nierównoważnych. Ze strony bardziej technicznej, funkcja porównywania jest predykatem binarnym, który wymusza ścisłe słabe porządkowanie w standardowym sensie matematycznym.
Odpowiednie bazowe klasy kontenerów obejmują priority_queue
deque
klasę i domyślny vector
klasę lub dowolny inny kontener sekwencji, który obsługuje operacje front
, push_back
i pop_back
iteratora dostępu losowego. Podstawowa klasa kontenera jest hermetyzowana w ramach adaptera kontenera, który uwidacznia tylko ograniczony zestaw funkcji składowych kontenera sekwencji jako interfejs publiczny.
Dodawanie elementów do obu elementów i usuwanie ich z priority_queue
obu elementów ma złożoność logarytmiczna. Uzyskiwanie dostępu do elementów w obiekcie ma stałą priority_queue
złożoność.
Istnieją trzy typy adapterów kontenerów zdefiniowanych przez standardową bibliotekę języka C++: stack
, queue
i priority_queue
. Każda z nich ogranicza funkcjonalność niektórych bazowych klas kontenerów w celu zapewnienia precyzyjnie kontrolowanego interfejsu standardowej struktury danych.
Klasa
stack
obsługuje strukturę danych liFO (last-in, last-in, first-out). Dobry analog do myślenia byłby stos płyt. Elementy (płyty) mogą być wstawiane, sprawdzane lub usuwane tylko z góry stosu, który jest ostatnim elementem na końcu kontenera podstawowego. Ograniczenie dostępu tylko do górnego elementu jest powodem używaniastack
klasy.Klasa
queue
obsługuje strukturę danych first-in, first-out (FIFO). Dobry analog do myślenia byłoby ludzie w kolejce do kasjera bankowego. Elementy (osoby) można dodać z tyłu wiersza i są usuwane z przodu linii. Zarówno z przodu, jak i z tyłu linii mogą być sprawdzane. Ograniczenie dostępu tylko do elementów przednich i tylnych w ten sposób jest powodem używaniaqueue
klasy.Klasa
priority_queue
porządkuje elementy tak, aby największy element był zawsze na najwyższym miejscu. Obsługuje on wstawianie elementu oraz inspekcję i usuwanie górnego elementu. Dobry analogia, aby pamiętać, byłoby ludzi w kolejce, gdzie są ułożone według wieku, wzrostu lub innego kryterium.
Konstruktory
Konstruktor | opis |
---|---|
priority_queue |
Tworzy obiekt priority_queue , który jest pusty lub jest kopią zakresu podstawowego obiektu kontenera lub innego priority_queue obiektu . |
Typedefs
Nazwa typu | opis |
---|---|
container_type |
Typ, który zapewnia kontener podstawowy do dostosowania przez element priority_queue . |
size_type |
Niepodpisany typ liczb całkowitych, który może reprezentować liczbę elementów w obiekcie priority_queue . |
value_type |
Typ reprezentujący typ obiektu przechowywanego jako element w obiekcie priority_queue . |
Funkcje składowe
Funkcja składowa | opis |
---|---|
empty |
Sprawdza, czy element priority_queue jest pusty. |
pop |
Usuwa największy element elementu priority_queue z górnej pozycji. |
push |
Dodaje element do kolejki priorytetów na podstawie priorytetu elementu z klasy operator< . |
size |
Zwraca liczbę elementów w elem.priority_queue |
top |
Zwraca odwołanie const do największego elementu w górnej części .priority_queue |
Wymagania
Nagłówek: <queue>
Przestrzeń nazw: std
priority_queue::container_type
Typ, który zapewnia kontener podstawowy do dostosowania.
typedef Container container_type;
Uwagi
Typ jest synonimem parametru Container
szablonu . Klasa deque
kontenera sekwencji biblioteki standardowej języka C++ i domyślna klasa vector
spełniają wymagania, które mają być używane jako kontener podstawowy dla priority_queue
obiektu. Typy zdefiniowane przez użytkownika spełniające wymagania mogą być również używane.
Aby uzyskać więcej informacji na temat Container
, zobacz sekcję priority_queue
Uwagi w temacie Klasa .
Przykład
Zobacz przykład, aby zapoznać się z przykładem priority_queue
sposobu deklarowania i używania elementu container_type
.
priority_queue::empty
Sprawdza, czy element priority_queue
jest pusty.
bool empty() const;
Wartość zwracana
true
jeśli wartość jest pusta priority_queue
; false
jeśli wartość jest pusta priority_queue
.
Przykład
// pqueue_empty.cpp
// 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
Usuwa największy element elementu priority_queue
z górnej pozycji.
void pop();
Uwagi
Aby priority_queue
zastosować funkcję składową, musi być nieistniena. Górna część elementu priority_queue
jest zawsze zajmowana przez największy element w kontenerze.
Przykład
// pqueue_pop.cpp
// 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
Tworzy obiekt priority_queue
, który jest pusty lub jest kopią zakresu podstawowego obiektu kontenera lub innego priority_queue
obiektu .
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);
Parametry
_comp
Funkcja porównania typu constTraits
używana do porządkowenia elementów w priority_queue
obiekcie , która domyślnie porównuje funkcję kontenera podstawowego.
_Cont
Podstawowy kontener, którego skonstruowany priority_queue
ma być kopią.
right
Element priority_queue
, z którego skonstruowany zestaw ma być kopią.
first
Położenie pierwszego elementu w zakresie elementów do skopiowania.
last
Położenie pierwszego elementu poza zakresem elementów do skopiowania.
Uwagi
Każdy z pierwszych trzech konstruktorów określa pusty początkowy , priority_queue
drugi określa również typ funkcji porównania (comp
) do użycia w ustaleniu kolejności elementów, a trzeci jawnie określając container_type
(_Cont
) do użycia. Słowo kluczowe explicit
pomija niektóre rodzaje automatycznej konwersji typów.
Czwarty konstruktor określa kopię elementu priority_queue right
.
Ostatnie trzy konstruktory kopiują zakres [first, last)
niektórych kontenerów i używają wartości, aby zainicjować priority_queue
element z rosnącą jawnością w określaniu typu funkcji porównania klasy Traits
i container_type
.
Przykład
// pqueue_ctor.cpp
// compile with: /EHsc
#include <queue>
#include <vector>
#include <deque>
#include <list>
#include <iostream>
int main( )
{
using namespace std;
// The first member function declares priority_queue
// with a default vector base container
priority_queue <int> q1;
cout << "q1 = ( ";
while ( !q1.empty( ) )
{
cout << q1.top( ) << " ";
q1.pop( );
}
cout << ")" << endl;
// Explicitly 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;
// This method of printing out the elements of a priority_queue
// removes the elements from the priority queue, leaving it empty
cout << "After printing, q2 has " << q2.size( ) << " elements." << endl;
// The third member function 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;
// The fourth member function declares a priority_queue and
// initializes it with elements copied from another container:
// first, inserting elements into q1, 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;
// The fifth member function 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;
// The sixth member function 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
Dodaje element do kolejki priorytetów na podstawie priorytetu elementu z klasy operator<
.
void push(const Type& val);
Parametry
val
Element dodany w górnej części elementu priority_queue
.
Uwagi
Górna część elementu priority_queue
to pozycja zajmowana przez największy element w kontenerze.
Przykład
// pqueue_push.cpp
// 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
Zwraca liczbę elementów w elem.priority_queue
size_type size() const;
Wartość zwracana
Bieżąca długość obiektu priority_queue
.
Przykład
// pqueue_size.cpp
// 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
Niepodpisany typ liczb całkowitych, który może reprezentować liczbę elementów w obiekcie priority_queue
.
typedef typename Container::size_type size_type;
Uwagi
Typ jest synonimem size_type
kontenera podstawowego dostosowanego przez element priority_queue
.
Przykład
Zobacz przykład, aby zapoznać się z przykładem size
sposobu deklarowania i używania elementu size_type
.
priority_queue::top
Zwraca odwołanie const do największego elementu w górnej części .priority_queue
const_reference top() const;
Wartość zwracana
Odwołanie do największego elementu określonego Traits
przez funkcję obiektu priority_queue
.
Uwagi
Aby priority_queue
zastosować funkcję składową, musi być nieistniena.
Przykład
// pqueue_top.cpp
// 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
Typ reprezentujący typ obiektu przechowywanego jako element w obiekcie priority_queue
.
typedef typename Container::value_type value_type;
Uwagi
Typ jest synonimem value_type
kontenera podstawowego dostosowanego przez element priority_queue
.
Przykład
// pqueue_value_type.cpp
// 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.
Zobacz też
Bezpieczeństwo wątku w standardowej bibliotece C++
Dokumentacja standardowej biblioteki C++