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]);
}