用自定义比较器在c ++中声明一个priority_queue
我试图声明priority_queue of nodes
的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)
重载的类。 所以你将不得不这样创build一个类:
class ComparisonClass { bool operator() (Node, Node) { //comparison code here } };
然后你将使用这个类作为第三个模板参数,如下所示:
priority_queue<Node, vector<Node>, ComparisonClass> q;
直接回答你的问题:
我试图声明一个节点的
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
不是一个types名称,而是一个带有两个Nodes
并返回一个bool
的函数的实例。
你需要的是指定函数指针types:
std::priority_queue<Node, std::vector<Node>, bool (*)(Node, Node)> openSet(Compare)