Classe priority_queue
Uma classe do adaptador de contêiner de modelo que fornece uma restrição de funcionalidade para limitar o acesso ao elemento superior de algum tipo de contêiner subjacente, que sempre é o maior ou a prioridade mais alta. Novos elementos podem ser adicionados ao priority_queue
e o elemento superior do priority_queue
pode ser inspecionado ou removido.
Sintaxe
template <class Type, class Container= vector <Type>, class Compare= less <typename Container ::value_type>>
class priority_queue
Parâmetros
Type
O tipo de dados do elemento a ser armazenado no priority_queue
.
Container
O tipo do contêiner subjacente usado para implementar o priority_queue
.
Compare
O tipo que fornece um objeto de função que pode comparar dois valores de elemento como chaves de classificação para determinar sua ordem relativa no priority_queue
. Esse argumento é opcional e o predicado binário less<typename Container::value_type>
é o valor padrão.
Comentários
Os elementos da classe Type
estipulados no primeiro parâmetro de modelo de um objeto de fila são sinônimo de value_type
e devem corresponder ao tipo de elemento na classe de contêiner subjacente Container
estipulada pelo segundo parâmetro de modelo. O Type
deve ser atribuível, para que seja possível copiar objetos desse tipo e atribuir valores a variáveis desse tipo.
O priority_queue
ordena a sequência que controla chamando um objeto de função armazenado da classe Traits
. De modo geral, os elementos precisam ser simplesmente menores que os comparáveis para estabelecer essa ordem: desse modo, considerando dois elementos, pode ser determinado que, ou eles são equivalentes (no sentido de que nenhum deles é menor que o outro), ou que um é menor que o outro. Isso resulta em uma ordenação entre os elementos não equivalentes. Fazendo uma observação mais técnica, a função de comparação é um predicado binário que induz a uma ordenação fraca restrita no sentido matemático padrão.
As classes de contêiner subjacentes adequadas para priority_queue
incluem a deque
Classe e a Classe vector
padrão ou qualquer outro contêiner de sequência que dá suporte às operações de front
, push_back
e pop_back
, e um iterador de acesso aleatório. A classe de contêiner subjacente é encapsulada dentro do adaptador do contêiner, que expõe apenas o conjunto limitado de funções membro de contêiner de sequência como uma interface pública.
Adicionar e remover elementos de um priority_queue
apresenta complexidade logarítmica. Acessar elementos em um priority_queue
apresenta uma complexidade constante.
Há três tipos de adaptadores de contêiner definidos pela Biblioteca Padrão C++: stack
, queue
e priority_queue
. Cada um deles restringe a funcionalidade de uma classe de contêiner subjacente para fornecer uma interface com precisão controlada a uma estrutura de dados padrão.
A classe
stack
dá suporte a uma estrutura de dados UEPS (último a entrar, primeiro a sair). Uma boa comparação é pensar em uma pilha de pratos. Os elementos (os pratos) podem inseridos, inspecionados ou removidos somente da parte superior da pilha, que é o último elemento no final do contêiner base. A restrição para acessar apenas o elemento superior é o motivo para usar a classestack
.A Classe
queue
dá suporte a uma estrutura de dados PEPS (primeiro a entrar, primeiro a sair). Uma boa comparação é pensar em uma fila de banco. Os elementos (as pessoas) vão sendo adicionados na parte final da fila e são removidos do início dela. Tanto o início quanto o final da fila podem ser inspecionados. A restrição de acessar apenas os elementos inicial e final dessa maneira é o motivo para usar a classequeue
.A classe
priority_queue
ordena seus elementos para que o elemento maior sempre esteja na posição superior. Ele dá suporte à inserção de um elemento e a inspeção e remoção do elemento superior. Uma boa comparação é pensar em pessoas em fila organizadas por idade, altura ou algum outro critério.
Construtores
Construtor | Descrição |
---|---|
priority_queue |
Constrói um priority_queue que é vazio ou que é uma cópia de um intervalo de um objeto de contêiner base ou de outro priority_queue . |
Typedefs
Nome do tipo | Descrição |
---|---|
container_type |
Um tipo que fornece o contêiner base para ser adaptado por um priority_queue . |
size_type |
Um tipo de inteiro sem sinal que pode representar o número de elementos em um priority_queue . |
value_type |
Um tipo que representa o tipo de objeto armazenado como um elemento em um priority_queue . |
Funções de membro
Função de membro | Descrição |
---|---|
empty |
Testa se priority_queue está vazio. |
pop |
Remove o maior elemento de priority_queue da posição superior. |
push |
Adiciona um elemento à fila de prioridade com base na prioridade do elemento de operator< . |
size |
Retorna o número de elementos no priority_queue . |
top |
Retorna uma referência const ao maior elemento na parte superior de priority_queue . |
Requisitos
Cabeçalho: <queue>
Namespace: std
priority_queue::container_type
Um tipo que fornece o contêiner base a ser adaptado.
typedef Container container_type;
Comentários
O tipo é um sinônimo do parâmetro de modeloContainer
. A classe de contêiner da sequência da Biblioteca Padrão C++ deque
e a classe vector
padrão atendem aos requisitos para serem usadas como o contêiner base para um objeto priority_queue
. Tipos definidos pelo usuário que satisfazem os requisitos também podem ser usados.
Para obter mais informações sobre Container
, consulte a seção Comentários do tópico priority_queue
Classe .
Exemplo
Veja o exemplo de priority_queue
que demonstra como declarar e usar container_type
.
priority_queue::empty
Testa se priority_queue
está vazio.
bool empty() const;
Valor de retorno
true
se priority_queue
for vazio; false
se priority_queue
não for vazio.
Exemplo
// 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
Remove o maior elemento de priority_queue
da posição superior.
void pop();
Comentários
priority_queue
não pode ser vazio para aplicar a função membro. A parte superior de priority_queue
sempre está ocupada pelo maior elemento no contêiner.
Exemplo
// 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
Constrói um priority_queue
que é vazio ou que é uma cópia de um intervalo de um objeto de contêiner base ou de outro 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);
Parâmetros
_comp
A função de comparação do tipo constTraits
usado para ordenar os elementos no priority_queue
, cujo padrão é a função de comparação do contêiner base.
_Cont
O contêiner do qual o priority_queue
construído será uma cópia.
right
O priority_queue
do qual o conjunto criado é uma cópia.
first
A posição do primeiro elemento no intervalo de elementos a serem copiados.
last
A posição do primeiro elemento além do intervalo de elementos a serem copiados.
Comentários
Cada um dos três primeiros construtores especificam um priority_queue
inicial vazio, o segundo também especifica o tipo da função de comparação (comp
) a ser usada para estabelecer a ordem dos elementos e a terceira especifica explicitamente o container_type
(_Cont
) a ser usado. A palavra-chave explicit
suprime determinados tipos de conversão de tipo automática.
O quarto construtor especifica uma cópia do priority_queue right
.
Os últimos três construtores copiam o intervalo [first, last)
de um contêiner e use os valores para inicializar um priority_queue
vez mais explícito ao especificar o tipo de função de comparação da classe Traits
econtainer_type
.
Exemplo
// 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
Adiciona um elemento à fila de prioridade com base na prioridade do elemento de operator<
.
void push(const Type& val);
Parâmetros
val
O elemento adicionado à parte superior do priority_queue
.
Comentários
A parte superior do priority_queue
é a posição ocupada pelo maior elemento no contêiner.
Exemplo
// 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
Retorna o número de elementos no priority_queue
.
size_type size() const;
Valor de retorno
O comprimento atual do priority_queue
.
Exemplo
// 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
Um tipo de inteiro sem sinal que pode representar o número de elementos em um priority_queue
.
typedef typename Container::size_type size_type;
Comentários
O tipo é um sinônimo do size_type
do contêiner base adaptado pelo priority_queue
.
Exemplo
Veja o exemplo de size
que demonstra como declarar e usar size_type
.
priority_queue::top
Retorna uma referência const ao maior elemento na parte superior de priority_queue
.
const_reference top() const;
Valor de retorno
Uma referência ao elemento maior, conforme determinado pela função Traits
, objeto do priority_queue
.
Comentários
priority_queue
não pode ser vazio para aplicar a função membro.
Exemplo
// 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
Um tipo que representa o tipo de objeto armazenado como um elemento em um priority_queue
.
typedef typename Container::value_type value_type;
Comentários
O tipo é um sinônimo do value_type
do contêiner base adaptado pelo priority_queue
.
Exemplo
// 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.
Confira também
Acesso Thread-Safe na Biblioteca Padrão C++
Referência da biblioteca padrão C++