Freigeben über


Verwenden der STL-PRIORITY_QUEUE-Klasse mit einem benutzerdefinierten Typ

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

Originalproduktversion: Visual C++
Ursprüngliche KB-Nummer: 837697

Zusammenfassung

In diesem Artikel wird beschrieben, wie Sie die STL-Vorlagencontaineradapterklasse priority_queue mit benutzerdefinierten (benutzerdefinierten) Datentypen wie Strukturen und Klassen verwenden. In diesem Artikel wird auch beschrieben, wie Sie die priority_queue Klassenmber anordnen, indem Sie die eckige eckige Klammer () oder die Vergleichsoperatoren des rechten Winkels (<>) überladen. In diesem Artikel wird auch beschrieben, wie Sie die priority_queue Containerklassenvariablen deklarieren, die die benutzerdefinierten (benutzerdefinierten) Datenmmber 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 Vorlagencontaineradapterklasse, die den Zugriff auf das oberste Element eines zugrunde liegenden Containertyps beschränkt. Um den Zugriff auf das oberste Element eines zugrunde liegenden Containertyps einzuschränken, ist 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){}
};

Notiz

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 Klassenmber angeben, indem Sie die rechte winkelige Klammer oder die Vergleichsoperatoren für die linke Winkelklammer ü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 wie pushpopemptyfolgt verwenden:

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

// 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 zu kompilieren. Führen Sie die folgenden Schritte aus, um die Compileroption für die Common Language Runtime-Unterstützung in Visual C++ hinzuzufügen:

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

    Notiz

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

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

  3. Wählen Sie "Common Language Runtime-Unterstützung", "Alte Syntax(/clr:oldSyntax)" in der Supportprojekteinstellung "Common Language Runtime" im rechten Bereich aus, wählen Sie "Übernehmen" und dann "OK" aus.

Weitere Informationen zur Compileroption zur Unterstützung der Common Language Runtime finden Sie unter /clr (Common Language Runtime Compilation).For more information about the common language runtime support compiler option, see /clr (Common Language Runtime Compilation).