我试图声明一个节点的priority_queue
,使用bool Compare(Node a, Node b)
作为比较器函数(它在节点类之外)。
我目前拥有的是:
priority_queue<Node, vector<Node>, Compare> openSet;
由于某种原因,我收到错误:“比较”不是类型名称
将声明更改为priority_queue
给我错误:预期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
?
注意-您可能还想检查其他答案,尤其是带有dectype和lambda的答案
您应该声明一个类Compare
并为其重载运算符()
,如下所示:
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;
}
接受的答案显示了如何使用类或std::function
作为比较器。我们也可以传递一个函数指针,正如cute_ptr的答案已经显示的那样。然而,这样做的语法比这里显示的要简单得多:
class Node;
bool Compare(Node a, Node b);
std::priority_queue<Node, std::vector<Node>, decltype(&Compare)> openSet(Compare);
也就是说,不需要显式编码函数的类型,您可以让编译器使用dectype
为您执行此操作。
如果比较器是lambda,这非常有用。除了使用dectype
之外,您不能以任何其他方式指定lambda的类型。例如:
auto compare = [](Node a, Node b) { return a.foo < b.foo; }
std::priority_queue<Node, std::vector<Node>, decltype(compare)> openSet(compare);
第三个模板参数必须是重载了Operator()(Node, Node)
的类。所以你必须这样创建一个类:
class ComparisonClass {
public:
bool operator() (Node, Node) {
//comparison code here
}
};
然后您将使用此类作为第三个模板参数,如下所示:
priority_queue<Node, vector<Node>, ComparisonClass> q;