繁体   English   中英

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

[英]C/C++: Creating simple graph library

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

我想到了在类中将动态指针指向顶点数组的想法。 但是,这样做效率低下,如果使用此方法,我还将遇到如何确定顶点连接的问题(我将无法确定哪些顶点与哪个顶点连接)。 另一种方法是创建一个Vertex类,该类假定包含其连通性信息。 但是,由于边的数量不确定,除了在Vertex中使用动态变量外,我无法想到其他方法。 这种方法会使我的代码效率更差。

那么有更好的方法吗?

如果您不打算在集合内部频繁添加和删除项目,则可以使用STL vectors 它们的迭代速度很快,但中间的插入和删除操作并不可怕。

如果您想经常在任何地方添加/删除,我将使用STL列表 它们的迭代速度较慢,但​​是插入/删除操作为O(1)。

然后,您可以将顶点和边定义为:

class Edge;

class Vertex
{
    // ...
public:
    std::list<Edge> incomingEdges;
    std::list<Edge> outgoingEdges;
}

class Edge
{
    // ...
public:
    Vertex startpoint;
    Vertex endpoint;
}

您会很快发现自己同时需要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 ++书之一是Cline,Girou撰写的The C ++ FAQBook,和洛莫。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM