C++ C++;超载>;对于优先级队列(最小堆):产生;二进制表达式(';常量节点';和';常量节点';)的操作数无效;关于堆的push()
我正在尝试重载>操作符,以便对优先级队列执行此操作:C++ C++;超载>;对于优先级队列(最小堆):产生;二进制表达式(';常量节点';和';常量节点';)的操作数无效;关于堆的push(),c++,operator-overloading,C++,Operator Overloading,我正在尝试重载>操作符,以便对优先级队列执行此操作: priority_queue<Node, vector<Node>, greater<Node> > unexplored_nodes; 在我尝试的所有3种方法中,都出现了一些错误(在代码中注释)。我一直在寻找实现它的方法(我尝试了larsmans的方法),但没有成功 如果有人能帮忙,我将不胜感激。(另外,如果您有更好的方法将优先级队列用作最小堆,以避免运算符重载,这也很好……这是主要目的。)您必须将运算
priority_queue<Node, vector<Node>, greater<Node> > unexplored_nodes;
在我尝试的所有3种方法中,都出现了一些错误(在代码中注释)。我一直在寻找实现它的方法(我尝试了larsmans的方法),但没有成功
如果有人能帮忙,我将不胜感激。(另外,如果您有更好的方法将优先级队列用作最小堆,以避免运算符重载,这也很好……这是主要目的。)您必须将运算符标记为
const
:
bool operator> (const Node &rhs) const {
return d > rhs.d;
}
编辑
如果不想重载运算符,可以为队列提供自己的比较器:
struct Comparator
{
bool operator() (const Node &lhs, const Node &rhs) const
{
return lhs.d > rhs.d;
}
};
void foo(const vector<Node> &list) {
priority_queue<Node, vector<Node>, Comparator> q;
q.push(list[0]);
}
结构比较器
{
布尔运算符()(常量节点和左侧、常量节点和右侧)常量
{
返回左侧d>右侧d;
}
};
void foo(常量向量和列表){
优先级队列q;
q、 推送(列表[0]);
}
编辑2
以下是如何使用自定义地图:
struct Comparator
{
typedef std::map<Node, float> Map;
explicit Comparator(const Map &map) : map(&map) {}
bool operator() (const Node &lhs, const Node &rhs) const
{
return map->find(lhs)->second > map->find(rhs)->second;
}
private:
const Map *map;
};
void foo(const vector<Node> &list, const Comparator::Map &map) {
priority_queue<Node, vector<Node>, Comparator> q(Comparator(map));
q.push(list[0]);
}
结构比较器
{
typedef std::map;
显式比较器(常量映射和映射):映射和映射{}
布尔运算符()(常量节点和左侧、常量节点和右侧)常量
{
返回地图->查找(左)-秒->地图->查找(右)-秒;
}
私人:
常量映射*映射;
};
void foo(常量向量和列表,常量比较器::Map和Map){
优先级队列q(比较器(map));
q、 推送(列表[0]);
}
发布问题后才发现此问题>\u>感谢您的快速回复。原因是因为rhs是常量,或者这是一个通常的规则,始终具有该属性?@dmonoply这是优先级队列使用的比较器的一个要求。C++11,
[alg.sorting]§2
:“假设comp
不会通过解引用迭代器应用任何非常量函数。”@dmonoply我还添加了一个选项,使用自定义比较器而不是运算符重载。哦,很好,谢谢!关于自定义比较器:假设我有一个从节点对象到浮动的映射或其他数据结构。我可以在自定义比较器中使用此映射来比较节点吗?理想情况下,这比我的特别“浮动d”更有意义。。。我想让它存储从其他地方到该节点的最短路径,但让它浮动在那里是没有意义的。我只是不知道如何将映射传递给自定义比较器…@dmonoply我使用映射添加了一个变体。
struct Comparator
{
bool operator() (const Node &lhs, const Node &rhs) const
{
return lhs.d > rhs.d;
}
};
void foo(const vector<Node> &list) {
priority_queue<Node, vector<Node>, Comparator> q;
q.push(list[0]);
}
struct Comparator
{
typedef std::map<Node, float> Map;
explicit Comparator(const Map &map) : map(&map) {}
bool operator() (const Node &lhs, const Node &rhs) const
{
return map->find(lhs)->second > map->find(rhs)->second;
}
private:
const Map *map;
};
void foo(const vector<Node> &list, const Comparator::Map &map) {
priority_queue<Node, vector<Node>, Comparator> q(Comparator(map));
q.push(list[0]);
}