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

标签 c++ iterator std

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

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

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/

相关文章:

c++ - 我可以轻松地覆盖 (STL) 迭代器的类别吗?

c++ - 如何从http请求正文字符串中获取文件名?

c++ - Valgrind 未显示使用不正确的 c_str() 的无效内存访问

c++ - C++中未声明的字符串

c# - 合并不同语言的程序

c++ - Sleep() 在 winapi32 中不起作用?

c++ - C++11 映射值的迭代器(简单透明)

c++ - 为什么GCC认为constexpr静态数据成员的定义必须标记为constexpr?

scala - 在函数调用的值上创建一个迭代器

python 迭代器、生成器以及介于两者之间的