gpt4 book ai didi

c++ - 使用 std::unordered_set 观察多个对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:41 29 4
gpt4 key购买 nike

我见过 Observer 设计模式的实现,其中 Observer 负责多个 Subject。大多数这些实现使用 std::vector<Subject*>为了跟踪主题。

我可以使用 std::unordered_set<weak_ptr<Subject>> 做类似的事情吗?反而?

我想使用 unordered_set 的原因是我不需要重复的,也不需要有序的容器。据我了解,unordered_set是在这种情况下要走的路。另外,我使用 weak_ptr 的原因它应该更安全吗?

如果您不同意,请留下一个答案,说明我应该改用什么容器。如果我确实使用了 unordered_set ,我必须为 weak_ptr 声明一个散列函数, 但这是否可以通过使用内部指针的散列函数来完成,用 subjects.lock().get() 获得?

最佳答案

首先,在我的回答中,我将使用 Subject 作为向注册观察者发送消息的对象,因为这是这两个术语的常用用法。

Would it be possible for me to do a similar thing, using a std::unordered_set<weak_ptr<Observer>> instead?

这是可能的。但是请记住,可以释放 weak_ptr 持有的对象,在访问底层对象之前需要将 weak_ptr 转换为 shared_ptr。这样做是为了在您处理对象时不会释放该对象。

Would it be possible for me to do a similar thing, using a std::unordered_set> instead?

如果你需要强制唯一性,unordered_set 对我来说是个不错的选择。如果不需要,那么 vector 是更直接的解决方案。有些人会说 unique_set 比 vector 更慢并且需要更多内存,但除非您需要非常频繁地注册观察者或成千上万的观察者,否则您不会注意到其中的区别。

关于弱指针,它给了你在注册时释放你的观察者的灵 active ,所以它应该没问题。如果您来自内存管理语言(如 Java),则此行为可能出乎意料。如果您想在它们在您的 Subject 中注册时保持它们存在,您可以改用 shared_pointer。

I would have to declare a hash function for the weak_ptr, but could this be accomplished by just using the hash function for the pointer inside, obtained with observer.lock().get()?

创建散列函数时要小心,我不建议您将对象的指针用于散列函数,特别是如果您的主题可以被复制/移动。相反,您可以在创建时使用计数器为每个 Subject 创建一个唯一标识符,并记住相应地编写复制/移动构造函数和运算符。

如果你不能写一个识别散列函数,那么你不应该使用 unique_set,因为你失去了它带来的优势。

作为脚注,对象容器的美妙之处在于您可以根据自己的需要来调整它们,如果每个解决方案都能满足您的真正需求,那么它就是正确的解决方案。

关于c++ - 使用 std::unordered_set 观察多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32412536/

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