簡體   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