私はカスタム比較関数を使用してC++で優先度キューを宣言しようとしています...
したがって、次のようにキューを宣言します。
std::priority_queue<int,std::vector<int>, compare> pq;
そして、ここに比較関数があります:
bool compare(int a, int b)
{
return (a<b);
}
私は以前、クラスなしでこれを同様の方法で行ったと確信していますが、今ではこのコードはコンパイルされず、このようないくつかのエラーが発生します:
type/value mismatch at argument 3 in template parameter list for 'template<class _Tp, class _Sequence, class _Compare> class std::priority_queue'
これに似ているが、クラスを使用せずに比較関数を作成する方法はありますか?
ありがとう
テンプレートパラメータは、比較関数のtypeである必要があります。関数はデフォルトで構築されるか、priority_queue
のコンストラクターで関数を渡します。どちらかを試してください
std::priority_queue<int, std::vector<int>, decltype(&compare)> pq(&compare);
または、関数ポインタを使用せず、代わりに標準ライブラリのファンクタを使用して、デフォルトで構築できるため、コンストラクタでインスタンスを渡す必要がなくなります。
std::priority_queue<int, std::vector<int>, std::less<int> > pq;
標準ライブラリファンクタを使用して比較関数を表現できない場合(優先度キューでカスタムクラスを使用する場合)、カスタムファンクタクラス またはラムダを使用 を記述することをお勧めします。
C++ 11 lambda 関数を使用できます。ラムダオブジェクトを作成し、decltype
を使用してテンプレートに渡し、コンストラクタに渡す必要があります。次のようになります。
auto comp = [] (int &a, int &b) -> bool { return a < b; };
std::priority_queue<int,std::vector<int>, decltype(comp) > pq (comp);
関数タイプを指定し、priority_queue
コンストラクターで関数をインスタンス化する必要があります。
#include <functional>
bool compare(int a, int b)
{
return (a<b);
}
std::priority_queue<int, std::vector<int>,
std::function<bool(int, int)>> pq(compare);
Typedefを使用できます。これは非常にうまくコンパイルされます:
typedef bool (*comp)(int,int);
bool compare(int a, int b)
{
return (a<b);
}
int main()
{
std::priority_queue<int,std::vector<int>, comp> pq(compare);
return 0;
}
std::priority_queue<int, std::vector<int>, bool (*)compare(int, int)> pq(compare);
言及されていない別の方法です。
これは私にとって完璧に機能しました。
struct compare{
bool operator() (const int& p1,const int& p2 ){
return p1<p2;
}
};
int main(){
priority_queue<int,vector<int>, compare > qu;
return 0;
}