STL PRIORITY_QUEUE クラスをカスタム型で使用する

この記事では、 priority_queue カスタム (ユーザー定義) データ型を使用する標準テンプレートライブラリ (STL) テンプレートコンテナーアダプタクラスを定義する方法について説明します。

元の製品バージョン:  Visual C++
元の KB 番号:  837697

概要

この記事では、STL priority_queue テンプレートコンテナーアダプタクラスを、構造やクラスなどのカスタム (ユーザー定義) データ型と共に使用する方法について説明します。 この記事では、左山 priority_queue かっこ (<) または右山かっこ (>) の比較演算子をオーバーロードして、クラスメンバーを順序付けする方法についても説明します。 この記事では、 priority_queue カスタム (ユーザー定義) データメンバーを含むコンテナークラスの変数を宣言する方法、およびプログラムでこれらの変数にアクセスする方法についても説明します。 この記事の情報は、アンマネージ Visual C++ コードにのみ適用されます。

Requirements

この記事では、STL データ型とコンテナー型を使用したプログラミングに精通していることを前提としています。

カスタムデータ型を作成する

priority_queueクラスは、基になるコンテナーの種類の最上位要素へのアクセスを制限するテンプレートコンテナーアダプタクラスです。 基になるコンテナーの種類の top 要素へのアクセスを制限するには、常に最も高い優先度を設定します。 クラスに新しい要素を追加 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 変数を作成してアクセスする

Template クラスのプロトタイプ 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 push pop 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++ で common language runtime support コンパイラオプション (/clr: oldSyntax) を追加する必要があります。 Visual C++ で [共通言語ランタイムサポート] コンパイラオプションを追加するには、次の手順を実行します。

  1. [プロジェクト] をクリックし、[ ** <ProjectName> プロパティ**] をクリックします。

    注意

    <ProjectName> は、プロジェクトの名前のプレースホルダーです。

  2. [構成プロパティ] を展開し、[全般] を選択します。

  3. [ Common Language Runtime support, Old 構文 (/clr: oldSyntax) ] 右ウィンドウの [共通言語ランタイムサポート] プロジェクト設定で、[適用] を選択し、[ OK] を選択します。

[Common language runtime support] コンパイラオプションの詳細については、「 /clr (Common Language runtime のコンパイル)」を参照してください。