2

我使用类似 STL 的迭代器在 C++ 中实现了访问者模式,用于存储访问者在容器中的当前位置。现在我想在迭代容器时更改容器,我对从容器中删除项目特别感兴趣,即使是我目前正在访问的项目。

现在显然这将使访客内部迭代器无效,因为它正好指向这个项目。目前,我将所有迭代器的列表存储在容器中并更新它们,只要将任何内容添加到列表中或从列表中删除。所以在某种程度上,这类似于应用于迭代器(作为 Observer)和列表(作为 Observable)的观察者模式。

或者,我考虑让 visitor() 方法向访问者返回一些关于当前项目发生了什么以及如何进行迭代的提示,但这听起来也不是一个好主意,因为 visit() 实现不应该真的很关心找到下一个项目。

所以,我的问题是:让访客继续工作的最佳方式是什么,即使物品被添加到容器中或从容器中移除。

问候,弗洛里安

更新:有一个访问者在容器上运行,但在 visit() 方法内部,可以在同一个容器上使用任意数量的附加迭代器。我希望访问者继续使用容器中的剩余项目,即使我们从调用 visit() 中返回,其中容器中的任何项目都被删除了。

4

3 回答 3

0

在这些情况下,如果复制我的容器并不昂贵,我只需复制它并在副本上进行迭代。原始容器通过 shared_ptr 保存对象,而副本仅保存weak_ptr。

于 2010-04-16T17:06:38.480 回答
0

在遍历期间改变容器时,迭代器充其量是危险的。使用索引并向后走是最安全的。

于 2010-04-15T09:42:59.380 回答
0

如果没有那么多迭代器和删除操作,我认为您的(第一个)实现非常好。如果是这种情况,我会使用像 Eddy 推荐的标记和扫描算法。另外,我认为后者更容易,因此更不容易出错。不要忘记跳过标记为删除的节点。另一方面,如果除了“删除”之外还有需要更新迭代器的情况,请坚持当前的实现。

于 2010-04-15T11:52:47.773 回答