사용자 정의 비교기를 사용하여 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, usingbool 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);
'programing tip' 카테고리의 다른 글
ASP.NET MVC 4 응용 프로그램 호출 원격 WebAPI (0) | 2020.12.08 |
---|---|
Python을 사용하여 디렉토리 내용을 디렉토리에 복사 (0) | 2020.12.08 |
Python의 다른 모듈에서 클래스를 패치하는 Monkey (0) | 2020.12.08 |
npm 패키지를 제거하는 방법은 무엇입니까? (0) | 2020.12.08 |
Pandas에서 색인 이름 제거 (0) | 2020.12.08 |