gpt4 book ai didi

c++ - 在不使迭代器失效的情况下添加和删除项目

转载 作者:搜寻专家 更新时间:2023-10-31 00:06:00 26 4
gpt4 key购买 nike

我有一个包含“观察者”列表的对象。这些观察者会收到通知,他们可能会通过在对象中添加或删除自己或其他观察者来响应此更改。

我想要一种健壮且不会不必要地缓慢的方式来支持这一点。

class Thing {
public:
class Observer {
public:
virtual void on_change(Thing* thing) = 0;
};
void add_observer(Observer* observer);
void remove_observer(Observer* observer);

void notify_observers();
private:
typedef std::vector<Observer*> Observers;
Observers observers;
};

void Thing::notify_observers() {

/* going backwards through a vector allows the current item to be removed in
the callback, but it can't cope with not-yet-called observers being removed */
for(int i=observers.size()-1; i>=0; i--)
observers[i]->on_change(this);

// OR is there another way using something more iterator-like?

for(Observers::iterator i=...;...;...) {
(*i)->on_change(this); //<-- what if the Observer implementation calls add_ or remove_ during its execution?
}
}

我或许可以有一个标志,由 add_ 和 remove_ 设置,以在迭代器失效时重置我的迭代器,然后可能在每个观察者中有一个“世代”计数器,这样我就知道我是否已经调用了它?

最佳答案

也许您可以使用更好(?)的设计。例如,您可以让通知函数根据它们的返回值将它们移除(或执行任何其他操作),而不是让观察者自行移除。

关于c++ - 在不使迭代器失效的情况下添加和删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/967219/

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