搭配使用自訂類型的 STL PRIORITY_QUEUE 類別

本文說明如何定義 priority_queue 使用自訂(使用者定義)資料類型的標準範本庫(STL)範本容器配接器類別。

原始產品版本:  Visual c + +
原始 KB 編號:  837697

摘要

本文說明如何使用 priority_queue 具有自訂(使用者定義)資料類型(如結構及類別)的 STL 範本容器配接器類別。 本文也說明如何 priority_queue 利用左角括弧(<)或右角括弧(>)比較運算子來排序類別成員。 本文也說明如何宣告 priority_queue 包含自訂(使用者定義)資料成員的容器類類別變數,以及如何在程式中存取這些變數。 本文中的資訊僅適用于非受管理的 Visual c + + 程式碼。

需求

本文假設您熟悉 STL 資料類型和容器類型的程式設計。

建立自訂資料類型

priority_queue類別是範本容器配接器類別,可限制對某些基礎容器類型的上方元素的存取。 若要限制基礎容器類型的上一個元素的存取,其優先順序一定為最高優先順序。 您可以將新元素新增至 priority_queue 類別,也可以檢查或移除類別的上方元素 priority_queue

若要使用 priority_queue 具有自訂(使用者定義)資料類型的類別,您必須定義自訂資料類型,如下列程式碼所示:

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

注意

若要定義相同用途的結構,您可以 class struct 在此程式碼範例中加以取代。

指定佇列順序

您可以 priority_queue 重載右角括弧或左的角括弧比較運算子來指定類別成員的順序,如下列程式碼範例所示:

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

使用自訂資料類型建立及存取 priority_queue 變數

範本類別的原型 priority_queue 如下:

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

如下所示 priority_queue ,宣告指定自訂資料類型和比較運算子的變數:

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

您可以使用不同的類別方法 priority_queue ,例如、 pushpop empty 和其他方法,如下所示:

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

完整程式代碼清單

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

在 Visual c + + 中,您必須新增公共語言執行時間支援編譯器選項(/clr: oldSyntax),才能成功編譯先前的程式碼範例。 若要在 Visual c + + 中新增公共語言執行時間支援編譯器選項,請遵循下列步驟:

  1. 按一下 [專案],然後按一下 [ ** <ProjectName> 屬性**]。

    注意

    <ProjectName> 是專案名稱的預留位置。

  2. 展開 [設定屬性],然後選取 [一般]。

  3. 在右窗格中,選取 [共同語言運行時間支援,舊語法(/clr: oldSyntax) ],然後選取 [套用] ,然後選取 [確定]

如需有關通用語言執行時間支援編譯器選項的詳細資訊,請參閱/clr (一般語言執行時間編譯)