Fila de prioridade C ++ com comparador personalizado

Fila de prioridade C ++ com comparador personalizado
Filas prioritárias são de fato um tipo de dados exclusivo. Eles são apoiados por montes (uma forma de uma árvore binária), mas foram utilizados da mesma forma que as filas. O que distingue uma fila de prioridade de uma fila regular seria que ela mantém seu arranjo de classificação na duração do O (logn), mesmo ao adicionar ou excluir novos membros. Com tipos de dados rudimentares, como números e cordas, usar uma fila de prioridade parece ser o mais simples. Filas prioritárias para tipos personalizadas são viáveis, assim como a capacidade de construir um padrão de classificação personalizado para tipos básicos. Usando filas prioritárias, você pode usar um comparador personalizado, como pedidos de vetores, para descrever como as entradas na fila de prioridade podem ser classificadas. Em C ++, isso normalmente é acabado com apenas uma estrutura. No entanto, as declarações lambda são mais rápidas para construir e permitir que você acesse variáveis ​​além do escopo (que é complexo para garantir que as estruturas). Então, dentro deste guia, discutiremos o exemplo da fila de prioridade com o comparador do cliente.

Exemplo:

Vamos começar com o exemplo de usar uma fila de prioridade com o comparador personalizado em C++. Portanto, a concha do terminal deve ser aberta com Ctrl+Alt+T Way curto. O arquivo C ++ precisa ser criado no shell usando a instrução "Touch" do Ubuntu. É muito fácil fazer isso. Depois disso, esse arquivo deve ser aberto em algum editor para fazer código. Você pode ter vim, texto ou editor de nano. Utilizamos o editor "Nano" aqui para edição rápida e atualização.

$ touch fila.cc
$ nano fila.cc

Portanto, o arquivo C ++ vazio será aberto na tela do terminal dentro do editor Nano. É hora de adicionar algumas bibliotecas de cabeçalho dentro de seu começo para fazer nosso código funcionar corretamente. Portanto, usamos o sinal "#include" com cada cabeçalho. O cabeçalho "iostream" é usado para usar o fluxo de entrada e saída. O cabeçalho "vetor" é fundido para usar a estrutura de dados do vetor. O cabeçalho "não -ordered_map" foi usado para criar um mapa para os valores de um vetor em quantidades. O arquivo de cabeçalho da “fila” está aqui para usar a fila de prioridade e suas funções de dados relacionadas. Iniciamos o método principal () após o uso de namespace padrão “std”, iniciamos o método principal (). Criamos uma estrutura de dados vetorial chamada "cor" do tipo de string para manter valores de string. Enquanto o objeto vetorial “cor” tem usado a função push_back () para adicionar alguns nomes de cores no vetor, i i.e., Vermelho, verde, azul, branco e preto.

#incluir
#incluir
#incluir
#incluir
usando namespace std;
int main ()

cout << "Starting… \n";
vetor cor;
cor.push_back ("vermelho");
cor.push_back ("verde");
cor.push_back ("azul");
cor.push_back ("branco");
cor.push_back ("preto");

Depois de criar um objeto vetor. O objeto para este mapa é "m" e contém parâmetros de string e número inteiro. O mapa é criado para ligar a quantidade inteira com o vetor de string, de modo que o valor do tipo inteiro é atribuído aos valores de string de um vetor "cor" individualmente.

UNODERED_MAPm;
m ["vermelho"] = 2;
m ["verde"] = 4;
m ["azul"] = 6;
m ["branco"] = 8;
m ["preto"] = 10;

Aí vem o comparador personalizado declarado como variável "CMP" com a palavra -chave "Auto.”A palavra -chave automática é usada para recuperar o resultado de qualquer tipo sem defini -la. A instrução "se" é usada para verificar se a quantidade de um valor esquerdo do mapa é igual à quantidade de um valor do mapa direito ou não. Se assim. Se eles não forem iguais, retornará que o valor da quantidade do lado direito é maior que o valor da quantidade do lado esquerdo de uma string através de um mapa. Isso está classificando a quantidade em ordem decrescente enquanto o nome da string é ordenado em ordem crescente.

cmp automático = [&] (string & l, string & r)
if (m [le] == m [r])
retornar l> r;
retornar m [r]> m [l];
;

Agora, é hora de criar uma fila de prioridade e adicionar todas as cores que utilizam o vetor. Portanto, a fila de prioridade foi gerada usando o vetor do tipo string, e o tipo de declaração foi definido como obtido da variável comp. O PQ é o objeto da fila de prioridade. O loop "for" está aqui para empurrar cada cor para a fila de prioridade "PQ" através da função push ().

Fila de prioridade, dTtype (CMP)> PQ (CMP);
para (const string & clr: cor)
pq.push (clr);

O loop "while" continua a ser executado até que a fila não esteja vazia e adiciona cada string à string "CLR". Esse valor específico seria aparecido e exibido na concha. Nosso código do programa está concluído aqui e pronto para ser executado.

enquanto(!pq.vazio())
string frut = pq.principal();
pq.pop ();
cout << fruit << " " << m[fruit] << endl;

cout << "Ending… \n";
retornar 0;

A compilação é bastante bem -sucedida. Mais do que isso, todos os valores de string do vetor foram exibidos no shell junto com suas quantidades que estão sendo mapeadas através de “mapa.”Você pode ver que a ordem de quantidade está descendo em nosso caso.

$ G ++ Fila.cc
$ ./a.fora

Conclusão:

Isso foi tudo sobre o exemplo simples de uma fila de prioridade com um comparador personalizado em c++. Discutimos isso em um único exemplo em detalhes, mantendo uma maneira mais simples e fácil. Adicionamos o código na forma de pedaços que ajudam os leitores a entendê -lo bem.