2016-03-22 1 views
-1

Boost Graph Libraryのドキュメントsaysでは、グラフから頂点を削除すると(少なくともその頂点がベクトルに格納されていると)、すべてのイテレータ(および記述子)は無効になります。ブーストグラフライブラリは、頂点を削除するときにすべてのイテレータを無効にするのはなぜですか?

これは意味があるとは限りませんので、私には驚きました。

adjacency_listは、このような場合に積極的にイテレータを無効化しないようにする方法はありますか?私はどうにかして頂点を無効にして、都合のいい時間にガベージコレクションをすることはできませんか?

+3

根底にあるベクトルのために起こることは分かっていますか? ['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)から要素を追加または削除すると、すべてのイテレータが無効になる可能性があります。 –

+1

正直言って、あなたの質問は非構造的な暴言のように読まれます。私はあなたのためにそれを編集することができますが、おそらくそうしたいと思います。 – sehe

+0

@sehe:いいですか?そうでない場合は、自由に編集してください。 – einpoklum

答えて

0

それはちょうど基礎となるコンテナの意味です:Iterator invalidation rules

これは明らかにもトレードオフです:あなたは自由のためのO(1)頂点のインデックスを取得します。

他にも必要な場合は、頂点コンテナに別のコンテナセレクタ(例:listS)を使用します。

ベクトルの頂点を単に無効にして、次のサイズ変更が必要なときにガーベジコレクションする方が良いのですか?

実際に、頂点を削除済みとしてマークするのは一般的なパターンです。 boost::filtered_graph<>はそのような場合に便利なアダプタです。

+0

1.コンテナに取り外しを渡すだけではなく、デザインの選択肢が違うので、トレードオフはできませんでした。 2. 'filtered_graph'を取って、各頂点(またはエッジ、またはその両方)に 'deleted'ブール値プロパティを追加し、削除操作をオーバーライドしますか? – einpoklum

+0

それはあなたに別の、同じように任意の、トレードオフを明らかに与えていたでしょう。フィルタリングされたグラフは単にフィルタリングします。上書きは行われません。頂点をフィルタリングされたセットに追加することにより、頂点を「論理的に」削除します。私(そして他の人たち)はこれを実証しているので、答えがあります。 – sehe

関連する問題