共用方式為


搭配自定義類型使用 STL PRIORITY_QUEUE 類別

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

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

摘要

本文說明如何使用 STL priority_queue 範本容器配接器類別搭配自訂 (用戶定義) 數據類型,例如結構和類別。 本文也說明如何藉由多載左角括弧 () 或右角括號 > (<) 比較運算符來排序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){}
};

注意事項

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

指定 QUEUE 順序

您可以多載右角括弧或左角括弧比較運算符來指定類別成員的 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 例如 pushpopempty和其他方法,如下所示:

// 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++ 中將 Common Language Runtime 支援編譯程式選項新增至 /clr:oldSyntax) (,才能成功編譯先前的程式代碼範例。 若要在 Visual C++ 中新增 Common Language Runtime 支援編譯程序選項,請遵循下列步驟:

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

    注意事項

    <ProjectName> 是專案名稱的佔位元。

  2. 展開 [ 組態屬性],然後選取 [ 一般]

  3. 在右窗格的 [Common Language Runtime 支援] 項目設定中,選取 [Common Language Runtime 支援]、[舊語法 (/clr:oldSyntax) ]、[用],然後選取 [確定]

如需 Common Language Runtime 支援編譯程式選項的詳細資訊,請參閱 /clr (Common Language Runtime 編譯)