2017-01-30 70 views
3

我使用升壓graph_traits和定義如下圖:刪除多個頂點從一個boost ::的adjacency_list圖

typedef boost::adjacency_list <boost::setS, boost::vecS, boost::undirectedS, NodeInfo, EdgeInfo> Graph; 
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex; 

我頂點的每個座標爲attatched,我打算找重複的頂點(頂點相同的位置)。所以我構建一個包含這些「羣」的列表:

std::vector<std::vector<Vertex>> clusters; 

現在我試圖合併每個集羣中的一個單一的頂點(頂點列表)。要爲集羣clusters[i]的每個頂點爲此,我呼籲:

boost::clear_vertex(v, graph) 
boost::remove_vertex(v, graph); 

但是我注意到,仍然重複保持。我想這與刪除索引時的變化有關,因爲我使用vecS作爲頂點列表。

這是什麼原因,我該如何解決?

回答

2

對於vectorS描述符與迭代器一樣不穩定:它們在插入/刪除時失效。請參閱Iterator and Descriptor Stability/Invalidation

當然,那裏描述的解決方案(使用listS)可能不適用於您的情況。

在這種情況下,請重新考慮您的問題,並考慮過濾圖形(不實際除去頂點)或將頂點標記爲已刪除。看到這裏的靈感:

+0

是否有可能進行排序頂點列表按降序排列,除去安全地刪除它們這種方式(如去除的索引我只應該影響指數>我在一個std ::向量)? – Chris

+0

原則上,是的。但是,我會堅持記錄的穩定性/失效保證。和「remove_vertex(),當它與VertexList = vecS的adjacency_list一起使用時,會使圖表的所有迭代器和描述符無效」does ** not **會爲您提供lee-way。 – sehe

+0

我測試了它,並沒有像我期望的那樣工作。也許我對內部工作原理的假設是錯誤的。現在我嘗試使用filtered_graph,但無法將其轉換回adjacency_list。 – Chris

相關問題