Använda STL-PRIORITY_QUEUE-klassen med en anpassad typ

Den här artikeln beskriver hur du definierar en STANDARD-mallcontaineradapterklass (Standard Template Library) priority_queue som använder anpassade (användardefinierade) datatyper.

Ursprunglig produktversion: Visual C++
Ursprungligt KB-nummer: 837697

Sammanfattning

Den här artikeln beskriver hur du använder STL-mallcontaineradapterklassen priority_queue med anpassade (användardefinierade) datatyper som strukturer och klasser. Den här artikeln beskriver också hur du beställer priority_queue klassmedlemmarna genom att överbelasta den vänstra vinkelparentesen (<) eller jämförelseoperatorerna för höger vinkelparentes (>). Den här artikeln beskriver också hur du deklarerar containerklassvariabler priority_queue som innehåller anpassade (användardefinierade) datamedlemmar och hur du kommer åt dessa variabler i ditt program. Informationen i den här artikeln gäller endast ohanterad Visual C++-kod.

Krav

Den här artikeln förutsätter att du är bekant med programmering med STL-datatyper och containertyper.

Skapa en anpassad datatyp

Klassen priority_queue är en mallcontaineradapterklass som begränsar åtkomsten till det översta elementet i någon underliggande containertyp. Att begränsa åtkomsten till det översta elementet i en underliggande containertyp är alltid högsta prioritet. Du kan lägga till nya element i priority_queue klassen och du kan undersöka eller ta bort det översta elementet i priority_queue klassen.

Om du vill använda priority_queue klassen med anpassade (användardefinierade) datatyper måste du definiera en anpassad datatyp enligt följande kod:

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

Obs!

Om du vill definiera en struktur för samma ändamål kan du ersätta class med struct i det här kodexemplet.

Ange KÖORDNING

Du kan ange klassmedlemmarnas priority_queue ordning genom att överbelasta den högra vinkelparentesen eller jämförelseoperatorerna för vänster vinkelparentes enligt följande kodexempel:

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

Skapa och komma åt priority_queue variabler med anpassade datatyper

Prototypen för mallklassen priority_queue är följande:

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

Deklarera en priority_queue variabel som anger den anpassade datatypen och jämförelseoperatorn enligt följande:

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

Du kan använda olika metoder i priority_queue klassen, till exempel push, pop, emptyoch andra metoder på följande sätt:

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

Fullständig kodlista

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

Du måste lägga till det gemensamma alternativet för språkkörningsstöd för kompilator (/clr:oldSyntax) i Visual C++ för att kunna kompilera det tidigare kodexemplet. Följ dessa steg om du vill lägga till det vanliga alternativet för språkkörningsstöd för kompilator i Visual C++:

  1. Klicka på Projekt och sedan på <ProjectName-egenskaper>.

    Obs!

    <ProjectName> är en platshållare för projektets namn.

  2. Expandera Konfigurationsegenskaper och välj sedan Allmänt.

  3. Välj Common Language Runtime Support, Old Syntax (/clr:oldSyntax) i projektinställningen Common Language Runtime support i den högra rutan, välj Använd och välj sedan OK.

Mer information om det vanliga alternativet för språkkörningsstöd för kompilator finns i /clr (Common Language Runtime Compil).