这个问题已经被多次提出,但我的情况略有不同。假设我有一个观察者的std::vector,当发生某个事件时,我会通知它们:
void SomeClass::doThing() {
// do things ...
// notify observers
for (auto* o : mObservers) {
o->thingHappened();
}
}
如果在实现
thingHappened
时,观察者调用SomeClass
中的一个方法来将自己从观察者列表中移除怎么办?有哪些最好的处理方式?一种可能性是在for循环之前对
mObservers
进行复制并使用复制品,但额外的复制可能会浪费资源。另一种可能性是将数组的更改委托给在循环结束后运行,或者在循环开始时设置锁(只是一个布尔值),当锁被设置为true时,更改向量的方法委托自身在循环完成后被调用,当锁被设置为false时(可以使用lambda向量来完成……相当繁琐)。
std::list
来轻松解决这个问题。 - NathanOliver