2011-10-14 41 views
2

我有兩個包含一些字段的struct:struct MyNodeData和struct MyEdgeData。當我創建VertexList時,作爲血管內皮細胞的圖形,還有訪問頂點等的描述符例如沒有問題:與VertexList不同於vecS的adjacency_list

typedef adjacency_list<setS, vecS, undirectedS, MyNodeData, MyEdgeData> Graph; 

typedef Graph::vertex_descriptor MyNodeDataID; 
typedef Graph::edge_descriptor MyEdgeDataID; 
typedef graph_traits <Graph>::vertex_iterator VertexIterator; 
typedef graph_traits <Graph>::edge_iterator EdgeIterator; 
typedef graph_traits <Graph>::adjacency_iterator AdjacencyIterator; 
typedef property_map < Graph, vertex_index_t >::type IndexMap; 

Graph g; 
const IndexMap index = get(vertex_index, g); 

/* Puis après avoir ajouté des vertex et edges, je peux accéder par exemple à la liste des vertex comme suite: */ 
pair<VertexIterator, VertexIterator> vi; 
for(vi = vertices(g); vi.first != vi.second; ++vi.first) 
{ 
    cout << "vertex: " << index[*vi.first] << endl; 
    // or: cout << "vertex: " << *vi.first << endl; 
} 

但我通常需要從我的圖表添加/刪除邊和頂點。所以我想使用setS或listS作爲VertexList而不是vecS,因爲使用vecS時,當我們刪除其中的一個時,索引無效! 問題是,如果我將VertexList定義爲setS或listS,我無法瀏覽頂點/邊的列表並訪問像我之前做過的描述符!

爲了簡短起見,我的問題是:因爲使用listS或setS作爲頂點容器的adjacency_list不會自動提供此vertex_id屬性,所以我如何將它添加到上面的代碼中?

+0

嗨!你會如何善意地將評論翻譯成英文? :) 問候 – DawidPi

回答

0

目前,您只需要提供一個關聯屬性圖。

<...> 
typedef Graph::vertex_descriptor NodeID; 

typedef map<NodeID, size_t> IndexMap; 
IndexMap mapIndex; 
associative_property_map<IndexMap> propmapIndex(mapIndex); 
<...> 

// indexing all vertices 
int i=0; 
BGL_FORALL_VERTICES(v, g, Graph) 
{ 
    put(propmapIndex, v, i++); 
} 
0

但我通常需要從我的圖表添加/刪除邊和頂點。

使用vecS,setS listS刪除頂點和邊。只需使用vertex \ edge描述符調用remove_vertex \ remove_edge即可。 在上述所有容器中,刪除\添加一個頂點\邊將會使迭代器失效。這意味着在修改圖形後,必須再次調用頂點(g)。在大多數容器中,修改容器會使迭代器無效。 在listS中,添加一個頂點可能不會使迭代器失效,但這是特定於實現的,不應該依賴於它。

您可以爲圖形添加vertex_id屬性,從而允許您在任何時候訪問頂點描述符。

相關問題