STL PRIORITY_QUEUE クラスを使用して、カスタムの型にする方法


この資料では、クラスを定義する標準テンプレート ライブラリ (STL) priority_queue テンプレート コンテナー アダプター クラス、構造体などのカスタム (ユーザー定義) のデータ型を使用する方法について説明します。この資料では、priority_queue のコンテナー クラスの要素を注文する方法についても説明します。

Microsoft.NET Framework によって、マネージ コードの両方のモデルは、の Microsoft Visual C++ .NET 2002 および Microsoft Visual C++ .NET 2003 のサポートが提供され、Microsoft Windows のネイティブのアンマネージ コードのモデルです。この資料の情報が Visual C++ のアンマネージ コードにのみ適用されます。 Microsoft Visual C++ 2005 は、Microsoft.NET Framework に用意されているマネージ コード モデルとアンマネージ ネイティブ Windows コード モデルの両方をサポートします。

この作業では

はじめに


この資料では、クラス、構造体などのカスタム (ユーザー定義) のデータ型の標準テンプレート ライブラリ (STL) priority_queueテンプレート コンテナーのアダプター クラスを使用する方法について説明します。左山かっこのオーバー ロードによって、 priority_queueクラスのメンバーを注文する方法についても説明"<"または右の山かっこ">"比較演算子です。Priority_queueカスタム (ユーザー定義) のデータ メンバーを含むコンテナー クラス変数を宣言する方法と、プログラムでこれらの変数にアクセスする方法についても説明します。

先頭に戻る

要件

この資料は次のトピックに精通している事を前提としています。
  • 標準のテンプレートの Library(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){}
};
注: 同じ目的のためには、構造体を定義するには、このコード サンプルでは、構造体クラスを置き換えることができます。

先頭に戻る

キューの順序を指定します。

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;
Pushpoppriority_queueクラスのさまざまな方法とその他の方法を次のように使用できます。
// 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;
}
注: 共通言語ランタイム サポートのコンパイラ オプションを追加する必要があります (または/clr:oldsyntax) Visual C++ 2005 では、前のコード例を正常にコンパイルします。Visual C++ 2005 で、共通言語ランタイム サポート コンパイラ オプションを追加するには、次の手順を実行します。

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



    < プロジェクト名 >は、プロジェクトの名前のプレース ホルダーです。
  2. [構成プロパティ] を展開し、 [全般] をクリックします。

  3. クリックして選択共通言語ランタイム サポート、古い構文 (または/clr:oldsyntax)共通言語ランタイム サポートのプロジェクト設定右側のペインをクリックし、[適用] をクリックし、[ OK] をクリックします。

コンパイラ オプションをサポートして、共通言語ランタイムの詳細については、次のマイクロソフト Web サイトを参照してください。
/clr (共通言語ランタイム コンパイル)
http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
先頭に戻る

関連情報


Priority_queueクラスのメンバーの使用方法の詳細については、次の Microsoft Developer Network (MSDN) Web サイトを参照してください。
priority_queue 関数 (STL のサンプル)
http://msdn2.microsoft.com/en-us/library/z3k60dkc(VS.71).aspx
先頭に戻る