Verwenden der STL-PRIORITY_QUEUE-Klasse mit einem benutzerdefinierten Typ

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

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

Zusammenfassung

In diesem Artikel wird beschrieben, wie Sie die STL-Vorlagen-Containeradapterklasse 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 spitzen Klammer (<) oder die rechtwinklige Klammer (>) anordnen. In diesem Artikel wird auch beschrieben, wie Sie die priority_queue Containerklassenvariablen deklarieren, die die benutzerdefinierten (benutzerdefinierten) Datenmember enthalten, und wie Sie auf diese Variablen in Ihrem Programm 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 Vorlagen-Containeradapterklasse, die den Zugriff auf das oberste Element eines zugrunde liegenden Containertyps beschränkt. Das Einschränken des Zugriffs auf das oberste Element eines zugrunde liegenden Containertyps 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 in diesem Codebeispiel durch struct ersetzenclass.

Angeben der WARTESCHLANGENreihenfolge

Sie können die Reihenfolge der priority_queue Klassenmember angeben, indem Sie die rechtwinklige Klammer oder die linken Vergleichsoperatoren für spitzen Klammern ü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 push, pop, emptyund andere Methoden wie folgt 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 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 zu kompilieren. Führen Sie die folgenden Schritte aus, um die Common Language Runtime-Unterstützungscompileroption in Visual C++ hinzuzufügen:

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

    Hinweis

    <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 Projekteinstellung Common Language Runtime-Unterstützung im rechten Bereich aus, wählen Sie Übernehmen und dann OK aus.

Weitere Informationen zur Common Language Runtime-Unterstützungscompiler finden Sie unter /clr (Common Language Runtime-Kompilierung).For more information about the Common Language Runtime support compiler option, see /clr (Common Language Runtime Compilation).