声明C ++中的priority_queue与自定义比较器(declaring a priority

2019-08-31 14:14发布

我试图宣布一个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

Answer 1:

你应该声明一个类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;
}


Answer 2:

第三个模板参数必须是谁拥有一流的operator()(Node,Node)超载。 所以,你必须创建一个类是这样的:

class ComparisonClass {
    bool operator() (Node, Node) {
        //comparison code here
    }
};

然后你会使用这个类作为像这样的第三个模板参数:

priority_queue<Node, vector<Node>, ComparisonClass> q;


Answer 3:

接受的答案会让你相信,你必须使用一个类或std::function作为比较。 这不是真的! cute_ptr的回答显示了如何将功能传递给构造函数,但有一个简单的方法:

priority_queue<Node, vector<Node>, decltype(&Compare)> openSet(Compare);

也就是说,没有必要进行明确编码函数的类型,你可以让编译器为你做的。



Answer 4:

直接回答你的问题:

我想声明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)



Answer 5:

你也可以使用lambda功能。

auto Compare = [](Node &a, Node &b) { //compare };
std::priority_queue<Node, std::vector<Node>, decltype(Compare)> openset(Compare);


文章来源: declaring a priority_queue in c++ with a custom comparator