当对象可能在迭代过程中被移除时,我如何安全地迭代容器?我基本上是在尝试实现观察者模式,有些事件会导致监听器从订阅容器中删除,这会导致迭代器出现问题。
我考虑过为每个听众提供一个标志,当它希望从订阅者列表中删除时可以设置该标志。因此,主体不会直接删除自己,而是在迭代期间检查标志,跳过标记的监听器,并在完成发送通知后清除所有标记的监听器。
我考虑的另一个选择是在每次调用 listener.notify
时启动一个线程,并让主题上的 remove_listener
方法成为互斥锁定操作。
第一个选项似乎不好,因为使用标志来指示某些对象的状态往往会在整个程序中激增,并且很快每次处理对象时都需要检查 if (!object.TO_BE_DELETED)
类似于空指针引起的问题。
第二个选项带来了使用线程的所有麻烦,如果程序使用大量事件,我敢肯定这会很快造成性能问题。
那么对于这个问题有什么更好的解决方案呢?
最佳答案
从容器中删除元素后,您永远不应该使用相同的迭代器,因为迭代器会失去意义,您应该拥有迭代器的更新版本。例如 std::list::erase 函数返回一个指向被移除元素的下一个位置的迭代器。
关于c++ - 遍历可能从容器中移除的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31267085/