集合比较器

时间:2018-05-11 14:25:09

标签: c++ graph forward-declaration cross-reference

我有一个使用节点(顶点)的图形结构,而节点又以std::pair<Node*, int>的形式附加边缘,其中节点是边缘的另一端,整数是边缘权重。我希望根据连接的节点索引和边缘权重将边缘排序在std::multiset中。

enum color { white, grey, black };

struct EdgeComparator;

struct Node {
  int n;
  std::multiset<std::pair<Node *, int>, EdgeComparator> edges;
  enum color col;
  int d;  // distance to source node

  explicit Node(int n) : n(n), edges(), col(white), d() {};
};

struct EdgeComparator {
  bool operator()(const std::pair<Node *, int> &p1,
                  const std::pair<Node *, int> &p2) {
    if (p1.second == p2.second)
      return p1.first->n < p2.first->n;
    return p1.second < p2.second;
  }
};

此前向声明方法会导致错误:invalid use of incomplete type struct EdgeComparator。如果我尝试切换它们并向前声明Node而不是EdgeComparator,则EdgeComparator不再显示n字段,因此我遇到了恶性循环。

我想到的唯一解决方法是使用std::vector代替std::multiset,然后应用std::sort,但这在效率方面会非常昂贵,所以我想知道如果有另一种方式。

0 个答案:

没有答案