您需要一个静态函数(以匹配比较操作的签名)。此外,您需要限定名称:
static bool cmp(const Event& a, const Event& b) {
return a.Pos.Y > b.Pos.Y;
}
std::priority_queue<Event, std::vector<Event>, decltype(&MyAlgo::cmp)>
Queue { &MyAlgo::cmp };
另外,请注意比较本身存在缺陷(它将变量与自身进行比较,导致Undefined Behaviour,因为弱总排序不一致。
简化
将比较器改为函数对象:
struct Cmp {
bool operator()(const Event& a, const Event& b) const {
return a.Pos.Y > b.Pos.Y;
}
};
std::priority_queue<Event, std::vector<Event>, Cmp> Queue;
现在你不能忘记将 cmp 实例传递给构造函数。
现场演示
Live On Coliru
#include <queue>
#include <iostream>
#include <array>
enum class EventType { SiteEvent };
struct FVector2D {
float X, Y;
friend std::ostream& operator<<(std::ostream& os, FVector2D const& fv)
{
return os << "{" << fv.X << "," << fv.Y << "}";
}
};
struct Node {
};
struct MyAlgo {
MyAlgo()
{
// some random generation of positions
for (auto pos : {FVector2D{1, 22}, {2, 3}, {8, 33}}) {
Queue.push({EventType::SiteEvent, pos, nullptr});
}
}
struct Event {
EventType Type;
FVector2D Pos;
Node* Arc = nullptr;
friend std::ostream& operator<<(std::ostream& os, Event const& ev) {
return os << ev.Pos;
}
};
struct Cmp {
bool operator()(const Event& a, const Event& b) const {
return a.Pos.Y > b.Pos.Y;
}
};
std::priority_queue<Event, std::vector<Event>, Cmp> Queue;
};
int main()
{
MyAlgo algo;
while (not algo.Queue.empty()) {
std::cout << algo.Queue.top() << "\n";
algo.Queue.pop();
}
}
打印
{2,3}
{1,22}
{8,33}