私のアプリケーションでは、(不均衡な)ツリーデータ構造があります。このツリーは、単に「std :: list of std::lists」で構成されています。ノードはサブノードの任意の「リスト」を保持します。単一のリストの代わりにこれを使用すると、アプリケーションの残りの部分がはるかに簡単になりました。(このプログラムは、移動するノードをあるツリーから別のツリー/ツリー内の別の部分/独自のツリーに変更することを目的としています)。
ここで明らかなタスクは、「ツリー」内のサブツリーを見つけることです。非再帰的検索の場合、それは十分に単純です。
subtree_iterator find_subtree(const N& n) {
auto iter(subtrees.begin());
auto e(subtrees.end());
while (iter != e) {
if ((*iter)->name == n) {
return iter;
}
++iter;
}
return e;
}
これは、イテレータをサブツリーの位置に戻します。ただし、マルチレベル検索を実装しようとすると問題が発生します。hello.world.test
つまり、ドットが新しいレベルを示す場所を検索したいと思います。
検索は問題なく機能しました
subtree_iterator find_subtree(const pTree_type& otree, std::string identify) const {
pTree_type tree(otree);
boost::char_separator<char> sep(".");
boost::tokenizer<boost::char_separator<char> > tokens(identify, sep);
auto token_iter(tokens.begin());
auto token_end(tokens.end());
subtree_iterator subtree_iter;
for (auto token_iter(tokens.begin()); token_iter != token_end; ++token_iter) {
std::string subtree_string(*token_iter);
subtree_iter = tree->find_subtree_if(subtree_string);
if (subtree_iter == tree->subtree_end()) {
return otree->subtree_end()
} else {
tree = *subtree_iter;
}
}
return subtree_iter;
}
一見、「正しく」動作しているように見えましたが、使用しようとすると失敗します。それを使用すると次のようになります
auto tIn(find_subtree(ProjectTree, "hello.world.test"));
if (tIn != ProjectTree->subtree_end()) {
//rest
}
ただし、「互換性のないイテレータをリストする」というデバッグアサーションエラーが発生します。これはそれほど奇妙なことではありません。異なるリストのイテレータを相互に比較しています。しかし、私はそのようなことを実装できますか?私の「バックアップ」オプションはstd::pair<bool,iterator>
、ブール部分がツリーが実際に存在するかどうかを判断する場所を返すことです。ツリー全体を単一のリストにする以外に、別の方法はありますか?