Uso de la clase STL PRIORITY_QUEUE con un tipo personalizado
En este artículo se describe cómo definir una clase de adaptador de contenedor de plantilla de biblioteca de plantillas estándar (STL) priority_queue
que usa tipos de datos personalizados (definidos por el usuario).
Versión original del producto: Visual C++
Número de KB original: 837697
Resumen
En este artículo se describe cómo usar la clase adaptadora de contenedor de plantilla STL priority_queue
con tipos de datos personalizados (definidos por el usuario), como estructuras y clases. En este artículo también se describe cómo ordenar los miembros de clase priority_queue
sobrecargando los operadores de comparación del corchete angular izquierdo (<) o del corchete angular derecho (>). En este artículo también se describe cómo declarar las priority_queue
variables de clase de contenedor que contienen los miembros de datos personalizados (definidos por el usuario) y cómo acceder a estas variables en el programa. La información de este artículo solo se aplica al código de Visual C++ no administrado.
Requisitos
En este artículo se supone que está familiarizado con la programación con tipos de datos STL y tipos de contenedor.
Creación de un tipo de datos personalizado
La priority_queue
clase es una clase de adaptador de contenedor de plantilla que limita el acceso al elemento superior de algún tipo de contenedor subyacente. Para limitar el acceso al elemento superior de un tipo de contenedor subyacente siempre es la prioridad más alta. Puede agregar nuevos elementos a la priority_queue
clase y puede examinar o quitar el elemento superior de la priority_queue
clase.
Para usar la priority_queue
clase con los tipos de datos personalizados (definidos por el usuario), debe definir un tipo de datos personalizado como se muestra en el código siguiente:
//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){}
};
Nota:
Para definir una estructura para el mismo propósito, puede reemplazar por class
struct
en este ejemplo de código.
Especificación del orden QUEUE
Puede especificar el orden de los miembros de clase priority_queue
sobrecargando el corchete angular derecho o los operadores de comparación de corchetes angulares izquierdos, como se muestra en el ejemplo de código siguiente:
//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;
}
Creación y acceso a variables de priority_queue con tipos de datos personalizados
El prototipo de la clase de plantilla es el priority_queue
siguiente:
template <
class Type,
class Container=vector<Type>,
class Compare=less<typename Container::value_type>
>
class priority_queue
Declare una priority_queue
variable que especifique el tipo de datos personalizado y el operador de comparación de la siguiente manera:
priority_queue<Student, vector<Student>,less<vector<Student>::value_type> > pqStudent1;
Puede usar métodos diferentes de la priority_queue
clase como push
, pop
, empty
y otros métodos como se indica a continuación:
// 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;
}
}
Debe agregar la opción del compilador de compatibilidad con Common Language Runtime (/clr:oldSyntax) en Visual C++ para compilar correctamente el ejemplo de código anterior. Para agregar la opción del compilador de compatibilidad con Common Language Runtime en Visual C++, siga estos pasos:
Haga clic en Proyectoy, a continuación, haga clic en <Propiedades de> NombreDeProyecto.
Nota:
<ProjectName> es un marcador de posición para el nombre del proyecto.
Expanda Propiedades de configuración y, a continuación, seleccione General.
Seleccione Compatibilidad con Common Language Runtime, Sintaxis antigua (/clr:oldSyntax) en la configuración del proyecto de soporte técnico de Common Language Runtime en el panel derecho, seleccione Aplicar y, a continuación, seleccione Aceptar.
Para obtener más información sobre la opción del compilador de compatibilidad con Common Language Runtime, vea /clr (Compilación de Common Language Runtime).
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de