我一直在考虑用图论在C ++中创建一个类。我们的想法是,为一个简单的图形(一对顶点之间至多一个边缘)保持无限数量的顶点和边缘是一个类。问题是我如何以最有效的方式存储这个无限数量的顶点/边。
我提出了将动态指针作为顶点数组作为类中的成员的想法。然而,它是低效的,我也遇到了如何确定顶点连接的问题(我无法确定哪个顶点连接哪个),如果我使用这个方法。另一种方法是创建一个Vertex类,它假设包含其连接信息。但是,由于边数不确定,除了在Vertex中使用动态变量之外,我想不出别的办法。这种方法会让我的代码效率更差。
那么有更好的方法吗?
答案 0 :(得分:4)
如果您不打算经常在馆藏中添加和删除项目,我会使用STL vectors。它们可以快速迭代,但对于插入而言并不可怕,并且在中间删除。
如果您想经常添加/删除,我会使用STL lists。它们的迭代速度较慢,但插入/删除是O(1)。
然后,您可以将顶点和边缘定义为:
class Edge;
class Vertex
{
// ...
public:
std::list<Edge> incomingEdges;
std::list<Edge> outgoingEdges;
}
class Edge
{
// ...
public:
Vertex startpoint;
Vertex endpoint;
}
答案 1 :(得分:2)
您很快就会发现自己想要一个Vertex和Edge类 - 有太多的算法依赖于着色,加权或标记边缘,并且混合有向和无向边缘也更简单。你可能不会非常关心动态存储适当的引用,因为这可以简化为一个指针向量。
要考虑的另一个问题是,如果你想要持久存储这个东西。
建议:尝试可能首先工作的最简单的事情。假设一个Array类根据需要调整自身大小,它看起来像
class Vertex {
Array<Edge> edges ;
VertexData vd ; // define this for the task.
public:
// ctor etc; quiz: what operations?
}
class Edge {
Vertex v1, v2;
EdgeData ed;
public:
// ctor etc
}
使用new
构造所有顶点和边,不要担心性能,并针对这些类编写一些代码。
然后回过头来,想想你如何喜欢来编写代码,并重新实现这些类以使 接口。
我有点偏见,因为我曾经教过这本书并为Marshall Cline和Mike Girou工作,但我觉得有人试图真正有效地使用它的最佳C ++书籍之一是The C++ FAQBook, Cline,Girou和Lomow。