2009-08-05 7 views
0

私は持っているかなり面白い質問。まだ別のSTLツリーの質問

私は今、HTMLパーサーに取り組んでいます。私はすべての入力目的にベクトルを使用していました。これは、ツリーを作成するために非常に上手く素早く見えました。

別のアプリケーションでは、HTML構造を編集する必要があります。要素の挿入や並べ替えは、ベクターを使用すると非常に苦痛になるので、ツリー構造に切り替えることにしました。

私は木々とその実装に関するいくつかの記事を読んで、私はこの目的のためにstd :: mapを考えていました。このような

何か:私はどこかの間でタグを挿入し、それらのすべては、いくつかのキー(例えば、固有の整数ID)によって命じたと思ったときに

std::map< element, *child_map >

は、だから私はまだすべてを更新する問題を抱えています挿入後にブランチ内のキー。例えば

: 1:SCRIPT 2:HEAD 3:私はHEAD後に新しい要素 "SCRIPT" を挿入したい場合はBODY

私は4にボディキーをインクリメントする必要があり、このようななめらかになります: 1:SCRIPT 2:HEAD 3:SCRIPT 4:BODY

は私に面倒ビットです。私はスムースを逃していますか?

代わりに私はlist<pair<>>の実装を行うと考えました。したがってソートはキーによって決定されず、余分な更新なしでどこにでも要素を追加できます。

+0

地図のキーに正確に保存したいものを明確にしてください。タグの順序? – Dewfy

答えて

2

私は子供が要素のメンバーを設定してくださいとstdを使用します::リスト:

class Element { 
/* ... */ 
    std::list<boost::shared_ptr<Element> > children; 
/* ... */ 
}; 

既存のDOMライブラリを使用しての代わりに、独自の圧延に見たいと思うかもしれません、と述べました。たとえば、htmlcxxを使用できます。

+0

Element *のリストは、削除するのが少し難しく(デストラクタや他の場所の子を手動で削除する必要があります)、親から要素を切り離すときに所有権をより複雑にします。私は非常にこの種のケースのためのいくつかの並べ替えのスマートなポインタを使用することをお勧めしたいと思います。 – bdonlan

+0

ありがとうございます。いい案!それはまさに私が必要としていたものです。実際、私はあなたの返事を見つける直前にほとんど同じ実装を書いていました。 – Andrew

+0

ありがとう!全く同感であります。もう1つの質問が – Andrew

0

一覧<ペア>など、あなたが何をしようとしてなど、ツリー構造の任意のフォームをシミュレートするためにうまく機能:

リスト<ペア<「HTML」、リスト>は、任意の数を保存してみましょうだろう子リスト内のオブジェクトの順序を制御することができます。

このツリーを歩いて楽しく過ごしてください。