7

プラットフォームに依存しないモデル レイヤーの場合、次のような階層データ (実際には文字列) があります。

  • アイテムA
    • サブアイテム A
    • サブアイテム B
    • サブアイテム C
      • サブサブアイテム A
      • サブサブアイテム B
    • サブアイテム D
  • アイテムB
  • アイテムC

ここで、各「レベル」(Item、SubItem、SubSubItem など) 内で、アイテムをアルファベット順に並べ替える必要があります。

簡単な解決策は、並べ替えられた std::Vector または std::MultiMap を使用して単純なクラスを作成し、その子を追跡し、その親へのポインターを作成することです。(および 1 つのルート項目)。一般に、各アイテムの子を順方向に反復処理する必要があります。

構築/ソート後、アイテムを追加または削除する必要はありません。通常、アイテムの数は少ない (数百)。

これは、アウトライン スタイル コントロールのバッキング データのモデル編成用です。

単純なクラスをローリングするのは簡単ですが、これは非常に一般的なパターンです — この動作を備えた既製の STL コンテナーが既に存在するのではないでしょうか?

4

4 に答える 4

5

STL自体には何もありませんが、これは便利だと思うかもしれません:

tree.hh: STL ライクな C++ ツリー クラス

その API は STL コンテナーに正確に従っており、探していることを実行するはずです。

実際、彼らの例はまさにあなたが求めているもの(文字列のあるツリー)だと思います。

于 2013-05-09T03:10:10.630 に答える
2

簡単な解決策:

あなたのキーはstd::vector<GUID>であり、GUIDは各要素を一意に識別する何らかのタイプ (GUID、ポインター、または文字列の可能性があります) です。要素の子は、単にその要素std::vector<GUID>を「プレフィックス」として持っています。

GUIDを介してソート可能である限りoperator<、 で辞書式ソートを行うstd::vectorと、要求した順序で物事が取得されます。

Amap<std::vector<GUID>, Value>はコンテナー、または手動でstd::vector< std::pair< GUID, Value > >並べ替えるです。.first

GUID型が「最後の要素」を持つことができる場合、ofとof{x,y,z}を見つけることで、 のすべての子を見つけることができます。「最後の要素」を与えることは、ネイキッドポインターを使用しないことの利点です。lower_bound{x,y,z}upper_bound{x,y,z,last_guid}

于 2013-05-09T04:03:50.893 に答える
1

いいえ、素っ気ないというつもりはありませんが、それが答えです。たとえば、 Josuttis、または標準を参照してください。あなたが提案した線に沿って親/子ポインタを持つクラスを作成し、それらのベクトルまたは他の標準コンテナを使用する必要があります。

于 2013-05-09T03:08:32.227 に答える
1

あなたの質問に対する答えはノーです。STL にはツリーがありません。あなたが提案したパターンは問題ありません。この質問も参照してください。

于 2013-05-09T03:12:14.653 に答える