在我的应用程序中,我有一个(不平衡的)树数据结构。这个树简单地由“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
}
然而,这给出了调试断言错误“list iterators not compatible”。这不是太奇怪:我正在比较来自不同列表的迭代器。但是我可以实现这样的事情吗?我的“备份”选项是返回std::pair<bool,iterator>
,其中布尔部分确定树是否实际存在。还有另一种方法,不是把整个树单列表吗?
答案 0 :(得分:1)
你不应该在内部使用迭代器。改为使用节点。
template <typename T>
struct Node {
T item;
Node<T>* next;
};
然后将Node封装在迭代器外观中,如下所示:
template<typename T>
class iterator {
private:
Node<T>* node;
public:
...
};
然后使用通用的无效节点(当节点为nullptr时),只要达到或返回end(),就返回该节点。 请注意,我建议的是单个链表(不是双链表作为标准链表)。这是因为您无法从指向无效空节点的无效通用end()迭代器返回。 如果你不在算法中使用迭代器运算符 - (),那应该没问题。
答案 1 :(得分:0)
std::vector<list_iterator>
遍历?堆栈的.back()
是唯一允许等于前一个end()
的{{1}},.front()
是根list
的迭代器?