2010-11-25 49 views
2

因此,在解決了BGL的循環依賴問題後,我又遇到了另一個障礙。BGL:如何有效存儲edge_descriptors和vertex_descriptors?

我目前使用的鄰接表到我的圖模型。節點和邊的捆綁屬性應用於在圖中存儲一些信息。所以,我有這樣的事情:

class Node { 
    int x, int y // position 
}; 
class Edge { 
    float length; 
}; 

boost::adjacency_list<boost::listS, boost::listS, boost::directedS, Node, Edge> 

的問題出現時,我想存儲的快捷方式到特定的節點和邊別的地方在我的代碼(例如,對於一個具有多個車道的街道)。我的第一個方法是保存我需要它們的edge_descriptors和vertex_descriptors。但是我想知道這樣的描述符會有多大(以字節爲單位)。也許有更好的解決方案,例如只存儲一小部分信息以獲得相同的結果。

有誰知道這是用於這種類型的向量的內存量:

std::vector<edge_descriptor> ? 

我已經想過只是存儲指向edge_descriptors,但我不知道是否以及如何將工作。

////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////////////////

編輯:現在,我的第一個問題已經回答看一遍,我依然在想一兩件事。我想爲圖類創建一些接口。這個接口應該從其他類中分離圖類的細節,這些類必須不知道圖的細節。因此其他類應該優選地將節點和邊緣識別爲數字。 於是我想出了兩個想法:

  1. 我用的hash_map std::tr1::unordered_map<int, edge_descriptor>能夠將數字轉換爲描述符,再次隨後用作索引到我的圖形對象。這可能是一個很大的步驟 - 也許如果有足夠的節點和邊緣需要計算,哈希值的計算將花費太多時間 。這就是爲什麼我有第二個想法。
  2. 圖形本身應該在內部將這些數字轉換爲邊和節點。我知道內部屬性和屬性地圖可以用來實現我的想法。然後,您可以只輸入像訪問一個節點:
    boost::property_map<My_Graph, my_prop>::type index = get(my_prop(), G);

但是,有沒有辦法財產的地圖,我綁定屬性結合在一起?

或者你有另一個想法,我沒打,沒?

回答

1

頂點和邊描述採取了非常小的尺寸。

頂點描述符是數字。 邊描述符是一個小結構,包含源和目標頂點描述符,以及指向附加到邊描述符的內部數據的指針。

因此,回答你的問題是,你可以在載體中使用它們。它不會構成內存問題。

+0

嘿,謝謝你的詳細信息。你是否也有一些互聯網資源,以便我可以向其他人證明這一點,如果他們問我? :-) – Bastian 2010-11-25 16:45:52