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
を正しく宣言するにはどうすればよいですか?
次のようにクラス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;
}
3番目のテンプレートパラメータは、operator()(Node,Node)
オーバーロードされたクラスでなければなりません。したがって、この方法でクラスを作成する必要があります。
class ComparisonClass {
bool operator() (Node, Node) {
//comparison code here
}
};
次に、このクラスを3番目のテンプレートパラメーターとして次のように使用します。
priority_queue<Node, vector<Node>, ComparisonClass> q;
受け入れられた答えにより、クラスまたはstd::function
をコンパレーターとして使用する必要があると思われます。本当じゃない! cute_ptr's answer は、コンストラクターに関数を渡す方法を示しましたが、もっと簡単な方法があります。
priority_queue<Node, vector<Node>, decltype(&Compare)> openSet(Compare);
つまり、関数の型を明示的にエンコードする必要はありません。コンパイラにそれを行わせることができます。
質問に直接答える:
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)
ラムダ関数を使用することもできます。
auto Compare = [](Node &a, Node &b) { //compare };
std::priority_queue<Node, std::vector<Node>, decltype(Compare)> openset(Compare);