Para usar o C ++ priority_queue, o programa deve começar com código como:
#incluir#incluir
usando namespace std;
Inclui a biblioteca de filas no programa.
Para continuar lendo, o leitor deve ter um conhecimento básico de C++.
Conteúdo do Artigo
- Introdução - veja acima
- Construção Básica
- Funções de membro importantes
- Outras funções de fila de prioridade
- String Data
- Outras construções de fila de prioridade
- Conclusão
Construção Básica
A estrutura de dados deve ser construída antes de poder ser usada. A construção aqui significa instanciar 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 prioridadeCom esta sintaxe, o maior valor é removido primeiro. Um exemplo de instanciação é:
Fila de prioridadeou
Fila de prioridadeO vetor e o deque são duas estruturas de dados em C++. Uma priority_queue pode ser criada com qualquer um deles. A sintaxe para criar uma fila de prioridade a partir da estrutura vetorial é:
Fila de prioridadeUm exemplo dessa instanciação é:
Fila de prioridadeObserve a lacuna entre> e> no final da declaração. Isso evita confusão com >>. O código de comparação padrão é “menos
Se o menor valor deve ser removido primeiro, a instrução deve ser:
Fila de prioridadeFunções de membro importantes
A função push ()
Esta função envia um valor, que é seu argumento, para a priority_queue. Retorna vazio. O código a seguir ilustra isso:
pq.empurre (10);
pq.empurre (30);
pq.empurre (20);
pq.empurre (50);
pq.empurre (40);
Esta priority_queue recebeu 5 valores inteiros na ordem de 10, 30, 20, 50, 40. Se todos esses elementos forem retirados da fila de prioridade, eles sairão na ordem de 50, 40, 30, 20, 10.
A função pop ()
Esta função remove da priority_queue o valor com a maior prioridade. Se o código de comparação for “maior
pq.empurre ('a'); pq.empurre ('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, em seguida, a função.
A função top ()
O pop () função remove o próximo valor de maior prioridade, mas não o retorna, pois pop () é uma função vazia. Use o principal() função para saber o valor de maior prioridade que deve ser removido a seguir. O principal() função retorna uma cópia do valor de maior prioridade em priority_queue. O código a seguir, onde o próximo valor de maior prioridade é o menor valor, ilustra isso
pq.empurre ('a'); pq.empurre ('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 função empty ()
Se um programador usa o principal() em uma priority_queue vazia, após a compilação bem-sucedida, ele receberia uma mensagem de erro como:
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 falso se a fila não estiver vazia. O código a seguir ilustra isso:
Fila de prioridadeint i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.push (i1); pq.empurrar (i2); pq.empurrar (i3); pq.empurrar (i4); pq.empurrar (i5);
enquanto(!pq.vazio())
cout << pq.top() << ";
pq.pop ();
cout << '\n';
Outras funções de fila de prioridade
A função size ()
Esta função retorna o comprimento da fila de prioridade, conforme o código a seguir ilustra:
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.push (i1); pq.empurrar (i2); pq.empurrar (i3); pq.empurrar (i4); pq.empurrar (i5);
int len = pq.Tamanho();
cout << len << '\n';
A saída é 5.
A função swap ()
Se duas priority_queues forem do mesmo tipo e tamanho, elas podem ser trocadas por esta função, como mostra o código a seguir:
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.push (i1); pq1.empurrar (i2); pq1.empurrar (i3); pq1.empurrar (i4); pq1.empurrar (i5);
Fila de prioridade
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.empurre (it1); pqA.empurre (it2); pqA.empurre (it3); pqA.empurre (it4); pqA.empurre (it5);
pq1.troca (pqA);
enquanto(!pq1.vazio())
cout << pq1.top() << ";
pq1.pop ();
cout<<'\n';
enquanto(!pqA.vazio())
cout << pqA.top() << ";
pqA.pop ();
cout<<'\n';
O resultado é:
5 4 3 2 1
50 40 30 20 10
A função emplace ()
O emplace () função é semelhante à função push. O código a seguir ilustra isso:
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';
O resultado é:
50 40 30 20 10
String Data
Ao comparar strings, a classe string deve ser usada e não o uso direto dos literais de string porque ela compararia ponteiros e não as strings reais. O código a seguir mostra como a classe string é usada:
#incluirFila de prioridade
string s1 = string ("caneta"), s2 = string ("lápis"), s3 = string ("livro de exercícios"), s4 = string ("livro de texto"), s5 = string ("régua");
pq1.empurrar (s1); pq1.empurrar (s2); pq1.empurrar (s3); pq1.empurrar (s4); pq1.empurrar (s5);
enquanto(!pq1.vazio())
cout << pq1.top() << " ";
pq1.pop ();
cout<<'\n';
O resultado é:
livro de texto livro de exercícios com régua e caneta
Outras 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:
vetor
Fila de prioridade
enquanto(!pq.vazio())
cout << pq.top() << ";
pq.pop ();
cout<<'\n';
O resultado é: 50 40 30 20 10. Desta vez, o cabeçalho do vetor também deve ser incluído. Os argumentos para a função construtora pegam os ponteiros de início e fim do vetor. O tipo de dados para o vetor e o tipo de dados para priority_queue deve ser o mesmo.
Para tornar o menor valor a prioridade, a declaração do construtor seria:
Fila de prioridadeCriação explícita de uma matriz
Uma fila de prioridade pode ser criada explicitamente a partir de uma matriz, como mostra o código a seguir:
Fila de prioridade
enquanto(!pq.vazio())
cout << pq.top() << ";
pq.pop ();
cout<<'\n';
O resultado é: 50 40 30 20 10. Os argumentos para a função construtora pegam os ponteiros de início e fim da matriz. arr retorna o ponteiro de início, “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 priority_queue deve ser o mesmo.
Para tornar o menor valor a prioridade, a declaração do construtor seria:
Fila de prioridadeNota: 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 crescente ou decrescente não é a única opção para a fila de prioridade. Por exemplo, uma lista de 11 inteiros para um heap máximo é:
88, 86, 87, 84, 82, 79,74, 80, 81,,, 64, 69
O maior valor é 88. Isso é seguido por dois números: 86 e 87, que são menos de 88. O resto dos números são menores do que esses três números, mas não estão realmente em ordem. Existem duas células vazias na lista. Os números 84 e 82 são menores que 86. Os números 79 e 74 são menores que 87. Os números 80 e 81 são menores que 84. Os números 64 e 69 são menores que 79.
A colocação dos números segue os critérios de heap máximo - veja mais tarde. A fim de fornecer tal esquema para a priority_queue, o programador deve fornecer seu próprio código de comparação - veja mais tarde.
Conclusão
Um C ++ priority_queue é uma fila first-in-first-out. A função de membro, Empurre(), adiciona um novo valor à fila. A função de membro, principal(), lê o valor mais alto na fila. A função de membro, pop (), remove sem retornar o valor superior da fila. A função de membro, vazio(), verifica se a fila está vazia. No entanto, a priority_queue difere da fila, pois segue algum algoritmo de prioridade. Pode ser maior, do primeiro ao último, ou pelo menos, do primeiro ao último. Os critérios (algoritmo) também podem ser definidos pelo programador.