Use a classe stl PRIORITY_QUEUE com um tipo personalizado
Este artigo descreve como definir uma classe de adaptador de contêiner de modelo STL (Standard Template Library) priority_queue
que usa tipos de dados personalizados (definidos pelo usuário).
Versão original do produto: Visual C++
Número de KB original: 837697
Resumo
Este artigo descreve como usar a classe adaptador de contêiner de modelo STL priority_queue
com tipos de dados personalizados (definidos pelo usuário), como estruturas e classes. Este artigo também descreve como ordenar os membros da priority_queue
classe sobrecarregando o colchete de ângulo esquerdo (<) ou os operadores de comparação de colchete de ângulo direito (>). Este artigo também descreve como declarar as variáveis de priority_queue
classe de contêiner que contêm os membros de dados personalizados (definidos pelo usuário) e como acessar essas variáveis em seu programa. As informações neste artigo se aplicam apenas ao código do Visual C++ não gerenciado.
Requisitos
Este artigo pressupõe que você esteja familiarizado com a programação com tipos de dados STL e tipos de contêiner.
Criando um tipo de dados personalizado
A priority_queue
classe é uma classe de adaptador de contêiner de modelo que limita o acesso ao elemento superior de algum tipo de contêiner subjacente. Limitar o acesso ao elemento superior de um tipo de contêiner subjacente é sempre a prioridade mais alta. Você pode adicionar novos elementos à priority_queue
classe e pode examinar ou remover o elemento superior da priority_queue
classe.
Para usar a priority_queue
classe com os tipos de dados personalizados (definidos pelo usuário), você deve definir um tipo de dados personalizado, conforme mostrado no seguinte código:
//Define a custom data type.
class Student
{
public:
char* chName;
int nAge;
Student(): chName(""),nAge(0){}
Student( char* chNewName, int nNewAge ):chName(chNewName), nAge(nNewAge){}
};
Observação
Para definir uma estrutura para a mesma finalidade, você pode substituir class
struct
neste exemplo de código.
Especificar ordem QUEUE
Você pode especificar a ordem dos membros da priority_queue
classe sobrecarregando o colchete de ângulo direito ou os operadores de comparação de colchete de ângulo esquerdo, conforme mostrado no exemplo de código a seguir:
//Overload the < operator.
bool operator< (const Student& structstudent1, const Student &structstudent2)
{
return structstudent1.nAge > structstudent2.nAge;
}
//Overload the > operator.
bool operator> (const Student& structstudent1, const Student &structstudent2)
{
return structstudent1.nAge < structstudent2.nAge;
}
Criar e acessar variáveis priority_queue com tipos de dados personalizados
O protótipo da classe de modelo é o priority_queue
seguinte:
template <
class Type,
class Container=vector<Type>,
class Compare=less<typename Container::value_type>
>
class priority_queue
Declare uma priority_queue
variável que especifica o tipo de dados personalizado e o operador de comparação da seguinte maneira:
priority_queue<Student, vector<Student>,less<vector<Student>::value_type> > pqStudent1;
Você pode usar diferentes métodos da priority_queue
classe, como push
, pop
, empty
e outros métodos da seguinte maneira:
// Add container elements.
pqStudent1.push( Student( "Mark", 38 ));
pqStudent1.push( Student( "Marc", 25 ));
pqStudent1.push( Student( "Bill", 47 ));
pqStudent1.push( Student( "Andy", 13 ));
pqStudent1.push( Student( "Newt", 44 ));
//Display container elements.
while ( !pqStudent1.empty())
{
cout << pqStudent1.top().chName << endl;
pqStudent1.pop();
}
Lista de código completa
// The debugger cannot handle symbols that are longer than 255 characters.
// STL frequently creates symbols that are longer than 255 characters.
// When symbols are longer than 255 characters, the warning is disabled.
#pragma warning(disable:4786)
#include "stdafx.h"
#include <queue>
#using <mscorlib.dll>
#if _MSC_VER > 1020 // if VC++ version is > 4.2
using namespace std; // std c++ libs implemented in std
#endif
using namespace System;
//Define a custom data type.
class Student
{
public:
char* chName;
int nAge;
Student(): chName(""),nAge(0){}
Student( char* chNewName, int nNewAge ):chName(chNewName), nAge(nNewAge){}
};
//Overload the < operator.
bool operator< (const Student& structstudent1, const Student &structstudent2)
{
return structstudent1.nAge > structstudent2.nAge;
}
//Overload the > operator.
bool operator> (const Student& structstudent1, const Student &structstudent2)
{
return structstudent1.nAge < structstudent2.nAge;
}
int _tmain()
{
//Declare a priority_queue and specify the ORDER as <
//The priorities will be assigned in the Ascending Order of Age
priority_queue<Student, vector<Student>,less<vector<Student>::value_type> > pqStudent1;
//declare a priority_queue and specify the ORDER as >
//The priorities will be assigned in the Descending Order of Age
priority_queue<Student, vector<Student>,greater<vector<Student>::value_type> > pqStudent2;
// Add container elements.
pqStudent1.push( Student( "Mark", 38 ));
pqStudent1.push( Student( "Marc", 25 ));
pqStudent1.push( Student( "Bill", 47 ));
pqStudent1.push( Student( "Andy", 13 ));
pqStudent1.push( Student( "Newt", 44 ));
//Display container elements.
while ( !pqStudent1.empty())
{
cout << pqStudent1.top().chName << endl;
pqStudent1.pop();
}
cout << endl;
// Add container elements.
pqStudent2.push( Student( "Mark", 38 ));
pqStudent2.push( Student( "Marc", 25 ));
pqStudent2.push( Student( "Bill", 47 ));
pqStudent2.push( Student( "Andy", 13 ));
pqStudent2.push( Student( "Newt", 44 ));
//Display container elements.
while ( !pqStudent2.empty())
{
cout << pqStudent2.top().chName << endl;
pqStudent2.pop();
}
cout << endl;
return 0;
}
}
Você deve adicionar a opção do compilador de suporte de runtime de linguagem comum (/clr:oldSyntax) no Visual C++ para compilar com êxito o exemplo de código anterior. Para adicionar a opção do compilador de suporte do common language runtime no Visual C++, siga estas etapas:
Clique em Projeto e clique <em Propriedades do ProjectName>.
Observação
<ProjectName> é um espaço reservado para o nome do projeto.
Expanda Propriedades de Configuração e selecione Geral.
Selecione Suporte ao Common Language Runtime, Sintaxe Antiga (/clr:oldSyntax) na configuração de projeto de suporte do Common Language Runtime no painel direito, selecione Aplicar e selecione OK.
Para obter mais informações sobre a opção do compilador de suporte do common language runtime, consulte /clr (Common Language Runtime Compilation).
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários