C ++

Como usar C ++ Priority_queue?

Como usar C ++ Priority_queue?
Em C ++, uma fila é uma estrutura de dados de lista onde o primeiro elemento a ser colocado na lista é o primeiro elemento a ser removido, quando a remoção ocorrer. Uma fila de prioridade em C ++ é semelhante, mas tem alguma ordem; é o elemento com o maior valor que é removido primeiro. A fila de prioridade ainda pode ser configurada para que seja o elemento com o menor valor a ser removido primeiro. Qualquer fila deve ter pelo menos o Empurre() função e o pop () função. O Empurre() função adiciona um novo elemento na parte de trás. Para a fila normal, o pop () função remove o primeiro elemento inserido. Para a fila de prioridade, o pop () função remove o elemento com a prioridade mais alta, que pode ser o maior ou o menor, dependendo do esquema de ordenação.

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 prioridade queueName;

Com esta sintaxe, o maior valor é removido primeiro. Um exemplo de instanciação é:

Fila de prioridade pq;

ou

Fila de prioridade pq;

O 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 prioridade, compare> pq;

Um exemplo dessa instanciação é:

Fila de prioridade, menos > pq;

Observe a lacuna entre> e> no final da declaração. Isso evita confusão com >>. O código de comparação padrão é “menos”, Significando que o maior, 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 deve ser removido primeiro, a instrução deve ser:

Fila de prioridade, maior > pq;

Funçõ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:

Fila de prioridade pq;
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”, Então ele removerá o elemento com o menor valor. Se chamado novamente, ele remove o próximo elemento com o menor valor do resto; chamado novamente, ele remove o próximo menor valor presente e assim por diante. Retorna vazio. O código a seguir ilustra isso:

Fila de prioridade, maior > pq;
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

Fila de prioridade, maior > pq;
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 saída é 'a "b" c "d" e'.

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:

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 falso se a fila não estiver vazia. O código a seguir ilustra isso:

Fila de prioridade pq;
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);
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:

Fila de prioridade pq;
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:

Fila de prioridade pq1;
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 pqA;
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:

Fila de prioridade pq1;
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:

#incluir
Fila de prioridade pq1;
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:

#incluir
vetor vtr = 10, 30, 20, 50, 40;
Fila de prioridade pq (vtr.begin (), vtr.fim());
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 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, como mostra o código a seguir:

int arr [] = 10, 30, 20, 50, 40;
Fila de prioridade pq (arr, arr + 5);
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 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 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.

Controle e gerencie o movimento do mouse entre vários monitores no Windows 10
Gerenciador de mouse com tela dupla permite que você controle e configure o movimento do mouse entre vários monitores, diminuindo seus movimentos pert...
WinMouse permite que você personalize e melhore o movimento do ponteiro do mouse no PC com Windows
Se você quiser melhorar as funções padrão do ponteiro do mouse, use um freeware WinMouse. Ele adiciona mais recursos para ajudá-lo a obter o máximo do...
O botão esquerdo do mouse não funciona no Windows 10
Se você estiver usando um mouse dedicado com seu laptop ou computador desktop, mas o o botão esquerdo do mouse não funciona no Windows 10/8/7 por algu...