gpt4 book ai didi

c++ - 迭代 std::vector 时删除(间接)

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

这个问题已被问过多次,但我的情况略有不同。假设我有一个 std::vector 观察者,当某个事件发生时我会通知它:

void SomeClass::doThing() {
// do things ...
// notify observers
for (auto* o : mObservers) {
o->thingHappened();
}
}

如果在 thingHappened 的实现中,观察者调用 SomeClass 中的方法将自己从观察者中移除会怎样?处理此问题的最佳方法有哪些?

一种可能是在 for 循环之前复制一份 mObservers 并使用它,但额外的拷贝可能会造成浪费。

另一种可能性是在循环完成后将更改委托(delegate)给要运行的数组,也许在循环开始之前设置一个锁(只是一个 bool 值),当设置了这个锁时,改变 vector 的方法将自己委托(delegate)给当 lock 设置为 false 时,在循环完成后调用(可以使用 lambdas vector 来完成......非常麻烦)。

最佳答案

如果您可以控制 thingHappened() 的签名,您可以将其更改为返回一个 bool 指示是否应将其删除。然后,您可以删除所有返回 true(或 false;取决于您想要的语义)的值。

幸运的是,std::remove_ifstd::partition保证对范围内的每个对象恰好调用谓词一次。

void SomeClass::doThing() {
// do things ...
// notify observers
auto newEnd = std::remove_if(mObservers.begin(), mObservers.end(), [](auto *o) {
return o->thingHappened();
});
// assuming mObservers is a vector
mObservers.erase(newEnd, mObservers.end());
}

关于c++ - 迭代 std::vector 时删除(间接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45152511/

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