2

我正在尝试重载 > 运算符,以便可以为优先级队列执行此操作:

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 的方法),但它们没有奏效。

如果有人可以提供帮助,我将不胜感激。(此外,如果您有更好的方法将优先级队列用作避免运算符重载的最小堆,那也很好......这是主要目的。)

4

1 回答 1

5

您必须将运算符标记为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]);
}

编辑 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]);
}
于 2013-09-13T17:13:25.577 回答