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

  1. Clique em Projeto e clique <em Propriedades do ProjectName>.

    Observação

    <ProjectName> é um espaço reservado para o nome do projeto.

  2. Expanda Propriedades de Configuração e selecione Geral.

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