泛型"out of bounds"、"past end"迭代器
generic "out of bounds", "past end" iterator
在我的应用程序中,我有一个(不平衡的)树数据结构。这个树只是由"std::list of std::lists"组成的——node包含任意的子节点"列表"。使用这个列表而不是单个列表使应用程序的其余部分变得容易多了。(该程序是关于将节点从一棵树移动到另一棵树/树中的另一部分/移动到它自己的树)。
现在一个显而易见的任务是在"树"中找到一个子树。对于非递归搜索,它很简单:
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;
}
在第一次glace时,它似乎"正确"工作,但当我尝试使用它时,它失败了。使用它就像
auto tIn(find_subtree(ProjectTree, "hello.world.test"));
if (tIn != ProjectTree->subtree_end()) {
//rest
}
然而,这会导致调试断言错误"list迭代器不兼容"。这并不奇怪:我正在比较不同列表中的迭代器。然而,我可以实现这样的事情吗?我的"备份"选项是返回一个std::pair<bool,iterator>
,其中布尔部分确定树是否真的存在。除了列出整棵树之外,还有其他方法吗?
您不应该在内部处理迭代器。请改用节点。
template <typename T>
struct Node {
T item;
Node<T>* next;
};
然后将Node封装在迭代器外观中,如下所示:
template<typename T>
class iterator {
private:
Node<T>* node;
public:
...
};
然后使用一个通用的无效节点(当节点为nullptr时),每当到达或返回end()时都会返回该节点。请注意,我建议的是一个单链表(而不是标准的双链表)。这是因为您不能从指向无效null节点的无效泛型end()迭代器返回。如果在算法中不使用迭代器运算符--(),这应该没问题。
std::vector<list_iterator>
堆栈要遍历?其中,堆栈的.back()
是唯一允许等于前一个的end()
的,而.front()
是根list
的迭代器?
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 反转依赖于 end() 的迭代器
- std::multimap<std::chrono::milliseconds, T>::rbegin 在 MSVS-13 中指向 end()?
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- 在 ifcondition al中 find() C++ STL 中的 == a.end() 有什么用?
- 野牛/yacc 解析器在不被空格分隔时跳过 grammer - "unexpected $end"
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 了解向量中的 .begin 和 .end
- 如何实现链表的 end()?
- 使用 map.end() 访问 map 的最后一个元素
- C++ const char with .begin() and .end()
- 接收"Error compiling: 0:1(1): error: syntax error, unexpected $end" C++、GLSL、着色器文件
- 为什么 std::find( s.begin(), s.end(), val ) 比集合 s 的 s.find(val) 慢 1000 倍<int>?
- 如何使用vector.begin()和vector.end()遍历矩阵?
- std::list.end() 不返回"past-the-end"迭代器
- 输入迭代器的示例`end()`实际上表示一个past-end-end
- 泛型"out of bounds"、"past end"迭代器
- One-past-end-of-object pointers