2017-01-30 1 views
3

私はブーストgraph_traitsを使用して、このようなグラフを定義している:::のadjacency_listグラフ

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

私の頂点の各座標が貼らしていると私は(頂点に重複頂点を見つけるつもり同じ場所)。だから私は、これらの「クラスター」を含むリストを構築:

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

は今、私は1つの頂点(頂点のリスト)に各クラスタをマージしようとしました。私はまだ重複が残っていることに気づいしかし

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

:これを行うには、私は、クラスタclusters[i]の各頂点のために呼び出します。私はそれが削除中にインデックスの変更に関連していると思います。これは、頂点リストにvecSを使用しています。

これはどのような理由があり、どのように解決できますか?

答えて

2

vectorSの場合、記述子はイテレータと同じように不安定です。挿入/削除時に無効になります。 Iterator and Descriptor Stability/Invalidation

もちろん、そこに記載されている解決策(listSを使用)は、あなたの状況には当てはまらない可能性があります。

その場合は、問題を再考し、グラフをフィルタリングして(実際に頂点を削除せずに)、または頂点を削除済みとしてマークすることを検討してください。インスピレーションのためにここを参照してください:

+0

が降順に削除しての除去として(安全に彼らにこの方法を削除する頂点のリストをソートすることは可能ですインデックスiは、std :: vectorのインデックス> iにのみ影響します)? – Chris

+0

原則として、はい。しかし、私は文書化された安定性/失効保証に固執します。また、remove_vertex()は、VertexList = vecSのadjacency_listで使用すると、グラフのすべてのイテレータと記述子を無効にします。 – sehe

+0

私はそれをテストし、期待どおりに動作しませんでした。おそらく、それが内部的にどのように動作するかに関する私の仮定は間違っていたでしょう。今度はfiltered_graphを使用しようとしましたが、adjacency_listに変換するのに問題がありました。 – Chris

関連する問題