【发布时间】:2021-12-03 02:31:23
【问题描述】:
所以基本上我有一个名为“事物”的对象向量,我在控制台上填充它。这些是我用来填充它们的对象的名称(汤姆、硬币、硬币、炸弹)。
for (int i = 0; i < 5; i++){
for (Thing * t : *locations[i]->getThings()) {
if (t->getName().compare("bomb") == 0){
for (Thing * all : *locations[i]->getThings()){
if(all->getName().compare("tom") != 0){
locations[i]->remove(all);
}
}
}
}
}
这段代码每次都会运行以检查列表中是否有一个名为炸弹的“事物”对象,并将删除除 tom 之外的所有其他对象。
因此,从上面的填充示例中,预期的列表应该只是 {tom}。但是,当代码运行时,它是 {tom, coin},这意味着它无法删除其他“非 tom”对象
【问题讨论】:
-
在迭代容器时从容器中移除一个项目是充满危险的。考虑改用the Erase-Remove idiom。
-
当您从容器中删除它指向的对象时,您的迭代器(请考虑将其称为
it而不是all)可能会变得无效。 -
@TimRandall
all不是迭代器 -
请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange 网络上发帖,您已在 CC BY-SA 4.0 license 下授予 Stack Exchange 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work?