web-dev-qa-db-ja.com

優先度キューの比較

私はカスタム比較関数を使用して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'

これに似ているが、クラスを使用せずに比較関数を作成する方法はありますか?

ありがとう

17
user2455103

テンプレートパラメータは、比較関数の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;

http://ideone.com/KDOkJf

標準ライブラリファンクタを使用して比較関数を表現できない場合(優先度キューでカスタムクラスを使用する場合)、カスタムファンクタクラス またはラムダを使用 を記述することをお勧めします。

14
leemes

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);
9
Jaa-c

関数タイプを指定し、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);
6
4pie0

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;
}
2
Emil Condrea
std::priority_queue<int, std::vector<int>, bool (*)compare(int, int)> pq(compare);

言及されていない別の方法です。

2
brack

これは私にとって完璧に機能しました。

struct compare{
    bool operator() (const int& p1,const int& p2 ){
         return p1<p2;
    }
};

int main(){
    priority_queue<int,vector<int>, compare > qu;
return 0;
}
0
tushar pahuja