C / C ++:创建简单的图形库

时间:2011-05-10 16:17:12

标签: c++

我一直在考虑用图论在C ++中创建一个类。我们的想法是,为一个简单的图形(一对顶点之间至多一个边缘)保持无限数量的顶点和边缘是一个类。问题是我如何以最有效的方式存储这个无限数量的顶点/边。

我提出了将动态指针作为顶点数组作为类中的成员的想法。然而,它是低效的,我也遇到了如何确定顶点连接的问题(我无法确定哪个顶点连接哪个),如果我使用这个方法。另一种方法是创建一个Vertex类,它假设包含其连接信息。但是,由于边数不确定,除了在Vertex中使用动态变量之外,我想不出别的办法。这种方法会让我的代码效率更差。

那么有更好的方法吗?

2 个答案:

答案 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。