2012-12-20 11 views
6

定期的にマージされるアイテム(グラフコンポーネントの構造)のstd::listをビルドします。アイデアは、2つのコンポーネントを接続するノードが1つのコンポーネントになり、リストにコンポーネントが列挙されることを発見した場合です。各コンポーネントには、親コンポーネントへのハンドル(この場合はstd::list<component>::iterator)があります。このコンポーネントは、マージされると設定されます。特定のノードが属するコンポーネントを決定するこの方法で、私はこのチェーンを歩きます。私が探しているものを最後に std :: listのアイテムを割り当てたままで削除します

は私がアイテム Nのイテレータを取るために、そして がリストからそれを割り当てを解除せずにを削除することができます std::listの操作です:リストの残りの構造正常に削除するのとまったく同じ方法で変更されます。

好ましくは、アイテムを再割り当てし、リストからコピーし、実際のremoveまたはeraseを呼び出すよりも、あまり醜いものではありません。

おそらく私はspliceとそれを達成することができます。私は "ジャンク"に削除する要素をスプライスする必要がありますlist、私か?

+5

_junkリストにスプライスする_右のように聞こえます... –

+0

このような方法では、互換性のないアロケータを使用するとコピーが強制される可能性は低いです。まだ...いくつかの余分なポインタがシャッフルされています。まあ...孤立していない完全なノードを反復する方法はありません。 –

+0

リストの代わりにリストを使用するのはなぜあなたに適していませんか? –

答えて

1

スプライスでこれを行うことができます。例えば、ジャンクリストに*itを移動:

junk.splice(junk.begin(),comp_list,it); 

またcomponentに移動-ctorのを追加することができます。次に、VARをtmpにするために、リスト移動の内容から消去する前に、このような何か:

component tmp(*it); 
li.erase(it); 

また、コンポーネント(またはstd::shared_ptr)へのポインタのリストを使用するFomin Arseniyの提案はあまりにも良いです。

+0

単純な 'リスト'は、必要以上に手作業による簿記になる可能性が高いですが、 'list >'は確かに確かなアプローチです。私は事を単純にしたいと思っていました.Junk Listのアプローチでは、 'new'キーワードの記述を避けることができます。 –

関連する問題