提问者:小点点

使用自定义比较器在c中声明priority_queue


我试图声明一个节点的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


共3个答案

匿名用户

注意-您可能还想检查其他答案,尤其是带有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;