2010-02-11 67 views
30

我正在尋找一種通過使用鍵而不是頂點引用本身來訪問頂點屬性的方法。 舉例來說,如果我有通過鍵找到Boost BGL頂點

class Data 
{ 
    public: 
    std::string name; 
    unsigned int value; 
}; 
typedef boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, Data > Graph; 
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex; 

而是採用

Vertex vertex1 = boost::add_vertex(g); 
g[vertex1].name = "Alpha"; 
g[vertex1].value = 10; 

我想有

g["Alpha"].name = "Alpha"; 
g["Alpha"].value = 10; 

是否準備使用的機制存在嗎?

回答

31

我想我已經找到了這樣的機制。它被稱爲labeled_graph並且是BGL的一部分。 代替使用的adjacency_list的,可以使用預定義的包裝labeled_graph

typedef boost::labeled_graph< 
    boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, Data >, 
    std::string 
> Graph; 

限定這樣的曲線圖後,就可以訪問以下列方式頂點:

Graph g; 

boost::add_vertex("Alpha", g); 
g["Alpha"].name = "Alpha"; 
g["Alpha"].value = 10; 

boost::add_vertex("Beta", g); 
g["Beta"].name = "Beta"; 
g["Beta"].value = 20; 

boost::add_edge_by_label("Alpha", "Beta", g); 

這樣做的副作用是需要使用graph()成員函數來完成一些算法:

std::vector<Graph::vertex_descriptor> container; 
boost::topological_sort(g.graph(), std::back_inserter(container)) ; 

由於某些原因,labeled_graph未在BGL文檔中描述,但它出現在示例文件夾中。

謝謝你的答覆, 塞爾

+0

在labeled_graph.hpp適配器的歷史看,它看起來像該文件是比較新的。 (開始出現在Boost庫版本1.40中)。可能這就是爲什麼它不是文檔的一部分, – 2010-02-13 12:40:35

1

由於adjacency_list概念不知道知道您想要通過結構中的字段訪問您的頂點屬性,因此不存在隨時可用的機制。

我寧願有一個額外的地圖,將數據的名稱映射到相應的頂點的方式。此外,您可以將算法封裝在類或函數中,以便在添加新頂點時自動填充地圖。