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 classstruct 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, emptyy 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:

  1. 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.

  2. Expanda Propiedades de configuración y, a continuación, seleccione General.

  3. 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).