programing tip

사용자 정의 비교기를 사용하여 C ++에서 priority_queue 선언

itbloger 2020. 12. 8. 07:48
반응형

사용자 정의 비교기를 사용하여 C ++에서 priority_queue 선언


(노드 클래스 외부에있는) 비교기 함수로 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;
}

허용되는 대답은 클래스 std::function또는를 비교기로 사용해야한다고 믿게합니다 . 이것은 사실이 아닙니다! cute_ptr의 답변 에서 알 수 있듯이 함수 포인터를 생성자에 전달할 수 있습니다. 그러나 이렇게하는 구문은 여기에 표시된 것보다 훨씬 간단합니다.

class Node;
bool Compare(Node a, Node b);

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

That is, there is no need to explicitly encode the function's type, you can let the compiler do that for you using decltype.

This is very useful if the comparator is a lambda. You cannot specify the type of a lambda in any other way than using decltype. For example:

auto compare = [](Node a, Node b) { return a.foo < b.foo; }
priority_queue<Node, vector<Node>, decltype(compare)> openSet(compare);

The third template parameter must be a class who has operator()(Node,Node) overloaded. So you will have to create a class this way:

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

And then you will use this class as the third template parameter like this:

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

Answering your question directly:

I'm trying to declare a priority_queue of nodes, using bool Compare(Node a, Node b) as the comparator function

What I currently have is:

priority_queue<Node, vector<Node>, Compare> openSet;

For some reason, I'm getting Error:

"Compare" is not a type name

The compiler is telling you exactly what's wrong: Compare is not a type name, but an instance of a function that takes two Nodes and returns a bool.
What you need is to specify the function pointer type:
std::priority_queue<Node, std::vector<Node>, bool (*)(Node, Node)> openSet(Compare)


One can also use a lambda function.

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

참고URL : https://stackoverflow.com/questions/16111337/declaring-a-priority-queue-in-c-with-a-custom-comparator

반응형