我正在尝试重载 > 运算符,以便可以为优先级队列执行此操作:
priority_queue<Node, vector<Node>, greater<Node> > unexplored_nodes;
我想将它用作最小堆。
这是 Node 结构的代码(我知道,最好有一个带有公共变量的结构,但我只是想要一些快速而肮脏的东西):
struct Node {
string repr;
float d;
vector<pair<Node, float> > neighbors;
Node(string repr) {
this->repr = repr;
this->d = FLT_MAX;
}
// **All three of these forms yield errors**
// Compiles without push() call below, but yields "invalids operands to binary expression" if I do have the push() call
//bool operator()(const Node* lhs, const Node* rhs) const {
// return lhs->d > rhs->d;
//}
// Compiles without push() call below, but yields "invalids operands to binary expression" if I have do the push() call
bool operator>(const Node &rhs) {
return d > rhs.d;
}
// Error regardless of priority queue below: overloaded 'operator>' must be a binary operator (has 3 parameters)
//bool operator>(const Node &lhs, const Node &rhs) {
// return lhs.d > rhs.d;
//}
};
void foo(const vector<Node> &list) {
priority_queue<Node, vector<Node>, greater<Node> > q;
q.push(list[0]); // this causes the 1st & 2nd overload attempt in the struct to have the "invalid operands" error
}
这就是我编译它的方式:
clang++ -std=c++11 -stdlib=libc++ thefile.cc
在我尝试的所有 3 种方式中,都出现了一些错误(在代码中注释)。我已经查看了从 STL 优先级队列创建最小堆以了解实现它的方法(我尝试了 larsmans 的方法),但它们没有奏效。
如果有人可以提供帮助,我将不胜感激。(此外,如果您有更好的方法将优先级队列用作避免运算符重载的最小堆,那也很好......这是主要目的。)