Verwenden der STL-PRIORITY_QUEUE-Klasse mit einem benutzerdefinierten Typ

In diesem Artikel wird beschrieben, wie Sie eine Standard Template Library (STL) priority_queue -Vorlagencontainer-Adapterklasse definieren, die benutzerdefinierte (benutzerdefinierte) Datentypen verwendet.

Originalversion des Produkts:   Visual C++
Ursprüngliche KB-Nummer:   837697

Zusammenfassung

In diesem Artikel wird beschrieben, wie Sie die STL-Vorlagencontainer-Adapterklasse priority_queue mit benutzerdefinierten (benutzerdefinierten) Datentypen wie Strukturen und Klassen verwenden. In diesem Artikel wird auch beschrieben, wie Sie die priority_queue Klassenmember durch Überladen der vergleichsoperatoren für die linke spitze Klammer (<) oder die rechte eckige Klammer (>) anordnen. In diesem Artikel wird auch beschrieben, wie Sie die priority_queue Containerklassenvariablen deklarieren, die die benutzerdefinierten (benutzerdefinierten) Datenmember enthalten, und wie Sie in Ihrem Programm auf diese Variablen zugreifen. Die Informationen in diesem Artikel gelten nur für nicht verwalteten Visual C++-Code.

Anforderungen

In diesem Artikel wird davon ausgegangen, dass Sie mit der Programmierung mit STL-Datentypen und Containertypen vertraut sind.

Erstellen eines benutzerdefinierten Datentyps

Die priority_queue Klasse ist eine Vorlagencontainer-Adapterklasse, die den Zugriff auf das oberste Element eines zugrunde liegenden Containertyps eingrenzt. Der Zugriff auf das oberste Element eines zugrunde liegenden Containertyps zu beschränken, hat immer die höchste Priorität. Sie können der priority_queue Klasse neue Elemente hinzufügen und das oberste Element der priority_queue Klasse untersuchen oder entfernen.

Um die priority_queue Klasse mit den benutzerdefinierten (benutzerdefinierten) Datentypen zu verwenden, müssen Sie einen benutzerdefinierten Datentyp definieren, wie im folgenden Code gezeigt:

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

Hinweis

Um eine Struktur für denselben Zweck zu definieren, können Sie sie in diesem Codebeispiel ersetzen class struct .

WARTESCHLANGEnreihenfolge angeben

Sie können die Reihenfolge der priority_queue Klassenmember angeben, indem Sie die rechtwinklige Klammer oder die linkswinkligen Vergleichsoperatoren überladen, wie im folgenden Codebeispiel gezeigt:

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

Erstellen und Zugreifen auf priority_queue Variablen mit benutzerdefinierten Datentypen

Der Prototyp der priority_queue Vorlagenklasse lautet wie folgt:

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

Deklarieren Sie eine priority_queue Variable, die den benutzerdefinierten Datentyp und den Vergleichsoperator wie folgt angibt:

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

Sie können verschiedene Methoden der priority_queue Klasse verwenden, zpush. B. , pop``emptyund andere Methoden wie folgt:

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

Vollständige Codeauflistung

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

Sie müssen die Common Language Runtime-Unterstützungscompileroption (/clr:oldSyntax) in Visual C++ hinzufügen, um das vorherige Codebeispiel erfolgreich kompilieren zu können. Führen Sie die folgenden Schritte aus, um die Common Language Runtime-Compileroption in Visual C++ hinzuzufügen:

  1. Klicken Sie auf Project und dann auf <ProjectName> "Eigenschaften".

    Hinweis

    <ProjectName> ist ein Platzhalter für den Namen des Projekts.

  2. Erweitern Sie die Konfigurationseigenschaften, und wählen Sie dann "Allgemein" aus.

  3. Wählen Sie im rechten Bereich in der Projekteinstellung "Common Language Runtime Support**, Old Syntax(/clr:oldSyntax)" die Option "Common Language Runtime Support, Old Syntax" (/clr:oldSyntax)** aus, und wählen Sie dann "OK" aus.

Weitere Informationen zur Common Language Runtime-Unterstützungscompileroption finden Sie unter /clr (Common Language Runtime Compilation).