我试图宣布一个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;
}
第三个模板参数必须是谁拥有一流的operator()(Node,Node)
超载。 所以,你必须创建一个类是这样的:
class ComparisonClass {
bool operator() (Node, Node) {
//comparison code here
}
};
然后你会使用这个类作为像这样的第三个模板参数:
priority_queue<Node, vector<Node>, ComparisonClass> q;
接受的答案会让你相信,你必须使用一个类或std::function
作为比较。 这不是真的! cute_ptr的回答显示了如何将功能传递给构造函数,但有一个简单的方法:
priority_queue<Node, vector<Node>, decltype(&Compare)> openSet(Compare);
也就是说,没有必要进行明确编码函数的类型,你可以让编译器为你做的。
直接回答你的问题:
我想声明priority_queue
节点,使用bool Compare(Node a, Node b) as the comparator function
我目前拥有的是:
priority_queue<Node, vector<Node>, Compare> openSet;
出于某种原因,我得到错误:
"Compare" is not a type name
编译器告诉你什么是错的: Compare
是不是一个类型的名字,但这需要两个函数的一个实例Nodes
,并返回一个bool
。
你需要的是指定的函数指针类型:
std::priority_queue<Node, std::vector<Node>, bool (*)(Node, Node)> openSet(Compare)
你也可以使用lambda功能。
auto Compare = [](Node &a, Node &b) { //compare };
std::priority_queue<Node, std::vector<Node>, decltype(Compare)> openset(Compare);