web-dev-qa-db-ja.com

カスタムコンパレータを使用してc ++でpriority_queueを宣言する

priority_queue of nodesを宣言しようとしていますが、bool Compare(Node a, Node b)をコンパレータ関数として使用しています(ノードクラスの外部にあります)。

私が現在持っているものは:

priority_queue<Node, vector<Node>, Compare> openSet;

何らかの理由で、Error: "Compare" is not a type nameを取得しています

宣言をpriority_queue <Node, vector<Node>, bool Compare>に変更します

Error: expected a '>'をくれます

私も試しました:

priority_queue<Node, vector<Node>, Compare()> openSet;
priority_queue<Node, vector<Node>, bool Compare()> openSet;
priority_queue<Node, vector<Node>, Compare<Node, Node>> openSet; 

priority_queueを正しく宣言するにはどうすればよいですか?

58
Steven Morad

次のようにクラスCompareを宣言し、operator()をオーバーロードする必要があります。

class Foo
{

};

class Compare
{
public:
    bool operator() (Foo, Foo)
    {
        return true;
    }
};

int main()
{
    std::priority_queue<Foo, std::vector<Foo>, Compare> pq;
    return 0;
}

または、何らかの理由でクラスとして作成できない場合は、std::functionを使用できます。

class Foo
{

};

bool Compare(Foo, Foo)
{
    return true;
}

int main()
{
    std::priority_queue<Foo, std::vector<Foo>, std::function<bool(Foo, Foo)>> pq(Compare);
    return 0;
}
75
awesoon

3番目のテンプレートパラメータは、operator()(Node,Node)オーバーロードされたクラスでなければなりません。したがって、この方法でクラスを作成する必要があります。

class ComparisonClass {
    bool operator() (Node, Node) {
        //comparison code here
    }
};

次に、このクラスを3番目のテンプレートパラメーターとして次のように使用します。

priority_queue<Node, vector<Node>, ComparisonClass> q;
13
Mic

受け入れられた答えにより、クラスまたはstd::functionをコンパレーターとして使用する必要があると思われます。本当じゃない! cute_ptr's answer は、コンストラクターに関数を渡す方法を示しましたが、もっと簡単な方法があります。

priority_queue<Node, vector<Node>, decltype(&Compare)> openSet(Compare);

つまり、関数の型を明示的にエンコードする必要はありません。コンパイラにそれを行わせることができます。

11
Cris Luengo

質問に直接答える:

bool Compare(Node a, Node b) as the comparator functionを使用して、ノードのpriority_queueを宣言しようとしています

私が現在持っているものは:

priority_queue<Node, vector<Node>, Compare> openSet;

何らかの理由で、エラーが発生しています:

"Compare" is not a type name

コンパイラは、何が間違っているのかを正確に伝えています。Compareは型名ではなく、2つのNodesを取り、boolを返す関数のインスタンスです。
必要なのは、関数ポインターのタイプを指定することです:
std::priority_queue<Node, std::vector<Node>, bool (*)(Node, Node)> openSet(Compare)

5
cute_ptr

ラムダ関数を使用することもできます。

auto Compare = [](Node &a, Node &b) { //compare };
std::priority_queue<Node, std::vector<Node>, decltype(Compare)> openset(Compare);
2
bornfree