我使用类似STL的迭代器在C ++中实现了访问者模式,用于存储访问者在容器中的当前位置。现在我想在迭代它时更改容器,我特别感兴趣的是从容器中删除项目,即使是我正在访问的项目。
现在显然这会使Visitors内部迭代器无效,因为它指的是这个项目。目前,我在容器中存储所有迭代器的列表,并在列表中添加或删除任何内容后立即更新它们。所以在某种程度上,这类似于应用于迭代器(作为Observer)和列表(作为Observable)的Observer模式。
或者我考虑让visitor()方法向访问者返回一些提示,告诉当前项目发生了什么以及如何继续迭代,但这听起来不是一个好主意,因为visit()实现不应该真正关心找到下一个项目。
所以,我的问题是:即使将项目添加到容器中或从中删除项目,保持访问者工作的最佳方式是什么。
此致 弗洛里安
更新:有一个访问者在容器上运行,但在visit()方法内部,可能会在同一容器上使用任意数量的其他迭代器。我希望访问者继续处理容器中的其余项目,即使我们从访问()中调用了容器中的任何一个项目被删除的访问()。
答案 0 :(得分:0)
在遍历过程中改变容器时,迭代器最多是危险的。使用索引并向后走是最安全的。
答案 1 :(得分:0)
如果没有那么多的迭代器和删除操作,我认为你的(第一个)实现是非常好的。如果是这种情况,我会使用像Eddy推荐的标记和扫描算法。此外,我认为后者更容易,因此不容易出错。不要忘记跳过标记为删除的节点。 另一方面,如果除了'delete'之外还有需要更新迭代器的情况,请坚持使用当前的实现。
答案 2 :(得分:0)
在这些情况下,如果复制我的容器并不昂贵,我只需复制它并迭代副本。原始容器通过shared_ptr保存对象,而副本只保存weak_ptr。