gpt4 book ai didi

C++ 迭代器 "remove-proof"

转载 作者:行者123 更新时间:2023-11-30 02:59:32 30 4
gpt4 key购买 nike

不知道有没有我需要的特殊关键字。我正在写一个基本的 observer pattern我担心一些问题。我的实现是经典的。我正在使用一个 std::set 观察者,每当我需要触发一个事件时,我都会遍历这个集合并调用每个观察者的 notify 方法。我的问题如下。当可观察对象向观察者发送事件时会发生什么:

  • 一个观察者想要在事件期间将自己(或任何其他观察者)从观察者集中移除?
  • 一个观察者想要清除观察者集(移除所有观察者)?
  • 一个观察者销毁可观察对象?

我知道所有这些情况最终都会发生。我对第三个有想法,但这是题外话。对于第一种和第二种情况,问题是删除或清除 std::set 将使我用来枚举可观察对象的迭代器无效。即使没有,observable 也不应该通知任何在事件处理期间会被删除的观察者。

我还没有找到一个 set 的实现,它提供了一个能够在删除任何项目时保持有效的迭代器。不过,有可能实现它,但要付出一些间接代价,并在容器中存储对事件迭代器的任何引用,以便在必要时更新它。

另一种解决方案是复制观察者集合,迭代拷贝并检查当前迭代的观察者是否仍在真实集合中。 (这会忘记在事件期间添加的任何新观察者,但这种情况我不在乎)

你对这个问题有什么建议/解决方案吗?

最佳答案

我假设您在容器中存储指针或其他东西,而不是实际的观察者对象本身。因为您显然不能让观察者代码删除观察者对象!

std::set 在迭代器处于事件状态时需要修改集合时根本无法使用。这不是它的用途。

如果您需要从容器中移除东西,您可以尝试从事件例程中返回一个值,告诉调用者(具有迭代器的代码)从容器中移除那个观察者。该代码可以删除迭代器指向的内容并沿着序列正确继续。

如果需要添加东西,不要直接添加到容器中。相反,将它们添加到队列中,并让触发事件的代码在完成对容器的迭代后添加新内容。

如果容器中的对象数量很少,而且对象很小(指针),我可能只是复制容器并遍历拷贝。这样,观察者可以随心所欲地处理容器,而不会搞砸迭代器。

关于C++ 迭代器 "remove-proof",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12824415/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com