Usare la classe PRIORITY_QUEUE STL con un tipo personalizzato

Questo articolo descrive come definire una classe adattatore del contenitore di modelli STL (Standard Template Library) priority_queue che usa tipi di dati personalizzati (definiti dall'utente).

Versione originale del prodotto: Visual C++
Numero KB originale: 837697

Riepilogo

Questo articolo descrive come usare la classe adattatore contenitore modello STL priority_queue con tipi di dati personalizzati (definiti dall'utente), ad esempio strutture e classi. Questo articolo descrive anche come ordinare i membri della classe eseguendo l'overload priority_queue degli operatori di confronto parentesi angolari sinistra (<) o parentesi angolari destra (>). Questo articolo descrive anche come dichiarare le variabili della priority_queue classe contenitore che contengono i membri dati personalizzati (definiti dall'utente) e come accedere a queste variabili nel programma. Le informazioni contenute in questo articolo si applicano solo al codice Visual C++ non gestito.

Requisiti

Questo articolo presuppone che si abbia familiarità con la programmazione con i tipi di dati STL e i tipi di contenitore.

Creazione di un tipo di dati personalizzato

La priority_queue classe è una classe adattatore contenitore modello che limita l'accesso all'elemento principale di un tipo di contenitore sottostante. Per limitare l'accesso all'elemento superiore di un tipo di contenitore sottostante è sempre la priorità più alta. È possibile aggiungere nuovi elementi alla priority_queue classe ed esaminare o rimuovere l'elemento principale della priority_queue classe.

Per usare la priority_queue classe con i tipi di dati personalizzati (definiti dall'utente), è necessario definire un tipo di dati personalizzato, come illustrato nel codice seguente:

//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

Per definire una struttura per lo stesso scopo, è possibile sostituire class con struct in questo esempio di codice.

Specificare l'ordine coda

È possibile specificare l'ordine dei membri della priority_queue classe eseguendo l'overload della parentesi quadra quadra destra o degli operatori di confronto tra parentesi angolari a sinistra, come illustrato nell'esempio di codice seguente:

//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;
}

Creare e accedere a variabili priority_queue con tipi di dati personalizzati

Il prototipo della priority_queue classe modello è il seguente:

template <
  class Type,
  class Container=vector<Type>,
  class Compare=less<typename Container::value_type>
>
class priority_queue

Dichiarare una priority_queue variabile che specifica il tipo di dati personalizzato e l'operatore di confronto come indicato di seguito:

priority_queue<Student, vector<Student>,less<vector<Student>::value_type> > pqStudent1;

È possibile utilizzare metodi diversi della priority_queue classe, ad pushesempio , pop, emptye altri metodi, come indicato di seguito:

// 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();
}

Elenco di codice completo

// 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;
    }
}

È necessario aggiungere l'opzione del compilatore di supporto di Common Language Runtime (/clr:oldSyntax) in Visual C++ per compilare correttamente l'esempio di codice precedente. Per aggiungere l'opzione del compilatore di supporto di Common Language Runtime in Visual C++, seguire questa procedura:

  1. Fare clic su Progetto e quindi su <Proprietà NomeProgetto>.

    Nota

    <ProjectName> è un segnaposto per il nome del progetto.

  2. Espandere Proprietà di configurazione e quindi selezionare Generale.

  3. Selezionare Supporto di Common Language Runtime, sintassi precedente (/clr:oldSyntax) nell'impostazione del progetto di supporto di Common Language Runtime nel riquadro destro, selezionare Applica e quindi selezionare OK.

Per altre informazioni sull'opzione del compilatore di supporto di Common Language Runtime, vedere /clr (Compilazione Common Language Runtime).