【发布时间】:2018-10-21 23:59:48
【问题描述】:
我有一个使用节点(顶点)的图形结构,它又以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,但这在效率方面会非常昂贵,所以我想知道是否有其他方法。
【问题讨论】:
标签: c++ graph forward-declaration cross-reference