Para usar o C ++ Priority_queue, o programa deve começar com o código como:
#incluir
#incluir
usando namespace std;
Inclui a biblioteca da fila no programa.
Para continuar lendo, o leitor deveria ter um conhecimento básico de C++.
Conteúdo do artigo
Construção Básica
A estrutura de dados deve ser construída primeiro antes de poder ser usada. Construção aqui significa instantar um objeto da classe de fila da biblioteca. O objeto da fila deve então ter um nome dado a ele pelo programador. A sintaxe mais simples para criar uma fila de prioridade é:
Fila de prioridadeQueuename;
Com esta sintaxe, o maior valor é removido primeiro. Um exemplo da instanciação é:
Fila de prioridadepq;
ou
Fila de prioridadepq;
O vetor e o deque são duas estruturas de dados em c++. Um priority_queue pode ser criado com qualquer um deles. A sintaxe para criar uma fila de prioridade a partir da estrutura vetorial é:
Fila de prioridade, Compare> pq;
Um exemplo dessa instanciação é:
Fila de prioridade, menos > pq;
Observe a lacuna entre> e> no final da declaração. Isso é para evitar confusão com >>. O código de comparação padrão é "menos", o que significa o melhor, e não necessariamente o primeiro valor, seria removido primeiro. Portanto, a declaração de criação pode ser simplesmente escrita como:
Fila de prioridade> pq;
Se o menor valor for removido primeiro, a declaração deve ser:
Fila de prioridade, maior > pq;
Funções de membros importantes
A função push ()
Esta função empurra um valor, que é o seu argumento, para o priority_queue. Ele retorna vazio. O código a seguir ilustra o seguinte:
Fila de prioridadepq;
pq.push (10);
pq.push (30);
pq.push (20);
pq.push (50);
pq.push (40);
Esta prioridade_queue recebeu 5 valores inteiros na ordem de 10, 30, 20, 50, 40. Se todos esses elementos forem saídos da fila de prioridade, eles sairão na ordem de 50, 40, 30, 20, 20, 10.
A função pop ()
Esta função remove do priority_queue o valor com a maior prioridade. Se o código de comparação for "maior", ele removerá o elemento com o menor valor. Se chamado novamente, ele remove o próximo elemento com o menor valor do restante; chamado novamente, ele remove o próximo menor valor presente e assim por diante. Ele retorna vazio. O código a seguir ilustra o seguinte:
Fila de prioridade, maior > pq;
pq.push ('a');
pq.push ('c');
pq.push ('b');
pq.push ('e');
pq.push ('d');
Observe que, para chamar uma função de membro, o nome do objeto deve ser seguido por um ponto e depois a função.
A função top ()
O pop () A função remove o próximo valor da maior prioridade, mas não a devolve, como pop () é uma função vazia. Use o principal() função para saber o valor da maior prioridade que deve ser removida a seguir. O principal() Função retorna uma cópia do valor da maior prioridade na prioridade_queue. O código a seguir, onde o próximo valor da maior prioridade é o menor valor, ilustra este
Fila de prioridade, maior > pq;
pq.push ('a'); pq.push ('c'); pq.push ('b'); pq.push ('e'); pq.push ('d');
char ch1 = pq.principal(); pq.pop ();
CHAR CH2 = PQ.principal(); pq.pop ();
char ch3 = pq.principal(); pq.pop ();
char ch4 = pq.principal(); pq.pop ();
char ch5 = pq.principal(); pq.pop ();
cout<A saída é 'a "b" c "d" e'.
A função vazia ()
Se um programador usa o principal() Função em uma prioridade vazia_queue, após a compilação bem -sucedida, ele receberia uma mensagem de erro como:falha de segmentação (despejo de núcleo)Portanto, sempre verifique se a fila de prioridade não está vazia antes de usar o principal() função. O vazio() A função de membro retorna um bool, verdadeiro, se a fila estiver vazia e falsa se a fila não estiver vazia. O código a seguir ilustra o seguinte:
Fila de prioridadepq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.push (i1); pq.push (i2); pq.push (i3); pq.push (i4); pq.push (i5);
enquanto(!pq.vazio())
cout << pq.top() << ";
pq.pop ();
cout << '\n';Outras funções da fila de prioridade
A função size ()
Esta função retorna a duração da fila de prioridade, como ilustra o código a seguir:Fila de prioridadepq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.push (i1); pq.push (i2); pq.push (i3); pq.push (i4); pq.push (i5);
int len = pq.tamanho();
cout << len << '\n';A saída é 5.
A função swap ()
Se dois Priority_queues forem do mesmo tipo e tamanho, eles podem ser trocados por essa função, como o código a seguir mostra:Fila de prioridadePQ1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
PQ1.push (i1); PQ1.push (i2); PQ1.push (i3); PQ1.push (i4); PQ1.push (i5);
Fila de prioridadePQA;
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
PQA.push (it1); PQA.push (it2); PQA.push (it3); PQA.push (it4); PQA.push (it5);
PQ1.troca (PQA);
enquanto(!PQ1.vazio())
cout << pq1.top() << ";
PQ1.pop ();
cout<<'\n';
enquanto(!PQA.vazio())
cout << pqA.top() << ";
PQA.pop ();
cout<<'\n';A saída é:
5 4 3 2 1
50 40 30 20 10O emplace () fucção
O emplace () A função é semelhante à função push. O código a seguir ilustra o seguinte:Fila de prioridadePQ1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
PQ1.emplace (i1);
PQ1.emplace (i2);
PQ1.emplace (i3);
PQ1.emplace (i4);
PQ1.emplace (i5);
enquanto(!PQ1.vazio())
cout << pq1.top() << ";
PQ1.pop ();
cout<<'\n';A saída é:
50 40 30 20 10Dados da string
Ao comparar strings, a classe String deve ser usada e não o uso direto dos literais de cordas porque compararia ponteiros e não as cordas reais. O código a seguir mostra como a classe String é usada:
#incluir
Fila de prioridadePQ1;
String S1 = String ("Pen"),
s2 = string ("lápis"),
s3 = string ("Livro de exercícios"),
s4 = string ("Livro de texto"),
s5 = string ("régua");
PQ1.push (s1);
PQ1.push (s2);
PQ1.push (S3);
PQ1.push (s4);
PQ1.push (S5);
enquanto(!PQ1.vazio())
cout << pq1.top() << " ";
PQ1.pop ();
cout<<'\n';A saída é:
Livro do livro de texto Livro de exercícios de caneta lápisOutras construções de fila de prioridade
Criação explícita de um vetor
Uma fila de prioridade pode ser criada explicitamente a partir de um vetor, como mostra o código a seguir:#incluir
vetorvtr = 10, 30, 20, 50, 40;
Fila de prioridadePQ (Vtr.BEGIN (), VTR.fim());
enquanto(!pq.vazio())
cout << pq.top() << ";
pq.pop ();
cout<<'\n';A saída é: 50 40 30 20 10. Desta vez, o cabeçalho do vetor também deve ser incluído. Os argumentos para a função do construtor levam os ponteiros iniciantes e finais do vetor. O tipo de dados para o vetor e o tipo de dados para o priority_queue devem ser os mesmos.
Para obter o menor valor a prioridade, a declaração para o construtor seria:
Fila de prioridade, maior> int >> PQ (VTR.BEGIN (), VTR.fim()); Criação explícita de uma matriz
Uma fila de prioridade pode ser criada explicitamente a partir de uma matriz, pois o código a seguir mostra:int arr [] = 10, 30, 20, 50, 40;
Fila de prioridadePQ (arr, arr+5);
enquanto(!pq.vazio())
cout << pq.top() << ";
pq.pop ();
cout<<'\n';A saída é: 50 40 30 20 10. Os argumentos para a função do construtor levam os ponteiros iniciantes e finais da matriz. ARR retorna o ponteiro inicial: “arr+5” retorna o ponteiro logo após a matriz e 5 é o tamanho da matriz. O tipo de dados para a matriz e o tipo de dados para o priority_queue deve ser o mesmo.
Para obter o menor valor a prioridade, a declaração para o construtor seria:
Fila de prioridade, maior > pq (arr, arr+5); Nota: em C ++, o priority_queue é realmente chamado de adaptador, não apenas um contêiner.
Código de comparação personalizado
Ter todos os valores na fila de prioridade ascendente ou toda a descendência não é a única opção para a fila de prioridade. Por exemplo, uma lista de 11 números inteiros para uma pilha máxima é:
88, 86, 87, 84, 82, 79,74, 80, 81 ,, 64, 69O valor mais alto é 88. Isto é seguido por dois números: 86 e 87, que são inferiores a 88. O restante dos números é menor que esses três números, mas não realmente em ordem. Existem duas células vazias na lista. Os números 84 e 82 são inferiores a 86. Os números 79 e 74 são inferiores a 87. Os números 80 e 81 são inferiores a 84. Os números 64 e 69 são inferiores a 79.
A colocação dos números segue os critérios max -heap - veja mais tarde. Para fornecer esse esquema para o priority_queue, o programador deve fornecer seu próprio código de comparação - veja mais adiante.
Conclusão
Um C ++ Priority_queue é uma primeira fila. A função do membro, empurrar(), adiciona um novo valor à fila. A função do membro, principal(), lê o valor máximo na fila. A função do membro, pop (), remove sem retornar o valor superior da fila. A função do membro, vazio(), verifica se a fila está vazia. No entanto, o priority_queue difere da fila, nisso, segue algum algoritmo de prioridade. Pode ser maior, do primeiro ao último, ou menos, do primeiro ao último. Os critérios (algoritmo) também podem ser definidos pelo programador.