gpt4 book ai didi

c++ - 在 erase() 之后保持一个有效的 vector::iterator

转载 作者:可可西里 更新时间:2023-11-01 15:02:49 24 4
gpt4 key购买 nike

编辑:我收到了很多答案,告诉我应该将删除分开到另一个循环中。也许我说得不够清楚,但我在最后一段中表示我想找到除此之外的解决方案。即保持当前的代码结构,但使用一些鲜为人知的 C++fu 使其工作。

好吧,我知道在 vector 上调用 erase() 会使元素及其后所有元素的迭代器失效,而 erase() 会返回一个迭代器到下一个有效的迭代器,但如果删除发生在其他地方怎么办?

我有以下情况(简化):

警告:不要假设这是完整的代码。下面显示的内容被极度简化以说明我的问题。下面显示的所有类和方法实际上要复杂得多。

class Child {
Parent *parent;
}

class Parent {
vector<Child*> child;
}

void Parent::erase(Child* a) {
// find an iterator, it, that points to Child* a
child.erase(it);
}

int Child::update() {
if(x()) parent.erase(*this) // Sometimes it will; sometimes (most) it won't
return y;
}

void Parent::update() {
int i = 0;
for(vector<A>::iterator it = child.begin(); it != child.end(); it++)
i += (*it)->update();
}

所以,很明显,如果 x() 返回 true,它会在运行 (*i​​t)->update() 后崩溃,因为当它发生时,Child将告诉 Parent 将它从 vector 中删除,使迭代器无效。

除了让 Parent::erase() 将迭代器一直传递回 Parent::update() 之外,还有什么方法可以解决这个问题吗?这将是有问题的,因为它不会在每次调用 Child::update() 时被调用,因此该函数需要一种方法每隔一段时间就返回一个迭代器给它自己,而且它是目前还返回另一个值。我还希望避免使用其他类似的方式将删除过程与更新循环分开。

最佳答案

你不能真正地同时迭代和改变一个 std::vector ,除非在迭代和改变之间有一些沟通。

我见过其他非标准的容器通过“智能”迭代器来促进这一点,这些迭代器知道它们的值何时被删除(并且可能自动跳转到下一个项目)。不过,这需要更多的簿记工作。

关于c++ - 在 erase() 之后保持一个有效的 vector::iterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6096279/

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