1

次のように構築されたベクターツリーを構築したい

struct myStruct {
    int a;
    string b;
};

typedef boost::make_recursive_variant<
      myStruct *
    , std::vector< boost::recursive_variant_ >
    >::type myStruct_tree;

複数のベクトルとそれらのベクトルのベクトルを追加する場合、ある種の位置ベクトルを使用してツリーをどのようにトラバースしますか

vector<int>

これは、ベクトル ポインター ツリーで定義された各ベクトル/サブベクトル内のオブジェクトの位置を特定します。

4

1 に答える 1

0

私はあなたの質問を 100% 理解しているとは言えません。何か間違っている場合は明確にしてください。ベクトルはパスであり、各要素は移動先の要素のインデックスを与えると仮定しています。それを念頭に置いて、私は次のようなことを試してみます:

myStruct_tree t = ...;

myStruct_tree* tit = &t;
for(iterator pit=path.begin(); pit!=path.end(); ++pit)
{
    // retrieve branches at current position
    vector<myStruct_tree>& vec = get<2>(*tit);

    // get next position in tree, will throw on bad index
    tit = &vec.at(*pit);
}
assert(tit);

// retrieve the leaf at the final position
myStruct* res = get<1>(*tit);

ノート:

  • インデックスに符号なし整数を使用することは、私にとってもう少し自然なことです。
  • vector::at() は範囲外で例外をスローします。
  • バリアントの要素を取得する方法の正確な構文を調べていません。上記で使用したバージョンget<1>(*tit);では、最初の要素 (つまり、myStruct ポインター) を取得するバージョンを意味していました。さらに、エラーを処理するために参照またはスローを返すものでなければなりません。
  • より良い診断を提供するために、範囲チェックを独自のコードに置き換えることを検討してください。アルゴリズムの構造を明確にするためにこれを行ったわけではありません。
于 2013-04-10T04:59:35.160 に答える