用自定义比较器在c ++中声明一个priority_queue

我试图声明priority_queue of nodespriority_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)