c++ - 遍历可能从容器中移除的对象

标签 c++ iteration containers observer-pattern

当对象可能在迭代过程中被移除时,我如何安全地迭代容器?我基本上是在尝试实现观察者模式,有些事件会导致监听器从订阅容器中删除,这会导致迭代器出现问题。

我考虑过为每个听众提供一个标志,当它希望从订阅者列表中删除时可以设置该标志。因此,主体不会直接删除自己,而是在迭代期间检查标志,跳过标记的监听器,并在完成发送通知后清除所有标记的监听器。

我考虑的另一个选择是在每次调用 listener.notify 时启动一个线程,并让主题上的 remove_listener 方法成为互斥锁定操作。

第一个选项似乎不好,因为使用标志来指示某些对象的状态往往会在整个程序中激增,并且很快每次处理对象时都需要检查 if (!object.TO_BE_DELETED) 类似于空指针引起的问题。

第二个选项带来了使用线程的所有麻烦,如果程序使用大量事件,我敢肯定这会很快造成性能问题。

那么对于这个问题有什么更好的解决方案呢?

最佳答案

从容器中删除元素后,您永远不应该使用相同的迭代器,因为迭代器会失去意义,您应该拥有迭代器的更新版本。例如 std::list::erase 函数返回一个指向被移除元素的下一个位置的迭代器。

关于c++ - 遍历可能从容器中移除的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31267085/

相关文章:

c++ - 继承类的意外转换

c++ - GCC 编译错误 : no match for ‘operator<’

c++ - 如何创建一个 std::set 结构?

c++ - 在循环中使用 string.length() 是否有效?

c++ - unordered_set 示例编译器错误(哈希和等价函数错误可能)

c++ - unsigned short 后 C 结构中的空字节 (Visual Studio 2013)

java - 当捕获异常而不是继续时,是否可以在循环中再次迭代?

python - 分布的迭代排列

CSS动画,如何减慢迭代速度?

kubernetes - 将应用程序配置文件添加到 kubernetes pod 的最佳实践