C++ 迭代时在列表中删除项时出现问题
好的,我有一个STL参考列表,我正在迭代。此函数有三个等效部分。该函数将wstring作为参数,并运行相应的if语句。我已将代码缩减为一个if语句,以尝试使其正常工作 所以,我检查以查看作为参数传入的内容。然后我检查分类项目是否是某种动物。如果它饿了,我检查它是否饿了,并将其从列表中删除。我现在只是想避免seg故障,但似乎做不到C++ 迭代时在列表中删除项时出现问题,c++,C++,好的,我有一个STL参考列表,我正在迭代。此函数有三个等效部分。该函数将wstring作为参数,并运行相应的if语句。我已将代码缩减为一个if语句,以尝试使其正常工作 所以,我检查以查看作为参数传入的内容。然后我检查分类项目是否是某种动物。如果它饿了,我检查它是否饿了,并将其从列表中删除。我现在只是想避免seg故障,但似乎做不到 list<ClassItem *>::iterator i = Items.begin(); while(i != Items.end()
list<ClassItem *>::iterator i = Items.begin();
while(i != Items.end())
{
if(!AnimalType.compare(L"tiger"))
{
if((*i)->IsAnimalType(L"tiger"))
{
if((*i)->IsHungry())
{
i = Items.erase(i);
}
}
else
{
++i;
}
}
// I have tried removing this
else
{
i++;
}
}
list::iterator i=Items.begin();
while(i!=Items.end())
{
如果(!AnimalType.compare(L“tiger”))
{
如果((*i)->IsAnimalType(L“tiger”))
{
如果((*i)->IsHungry())
{
i=项目。删除(i);
}
}
其他的
{
++一,;
}
}
//我试过把这个拿走
其他的
{
i++;
}
}
当我调用erase时,我的印象是当前迭代器无效。因此,如果我删除一个元素,我将返回下一个有效的迭代器。我哪里做错了
编辑:谢谢你的快速帮助。问题已经解决了。我使用了phresnel的解决方案,效果非常好。您可能需要添加
continue;
删除后。您可能需要添加
continue;
删除后。最好使用合适的谓词。这完全避免了手动循环,减少了错误的范围,有助于消除或至少定位问题的根源,因为只要谓词是正确的,您就可以相信这个习惯用法是正确的
bool badAnimal(ClassItem * item)
{
// return true if animal is to be removed
}
Items.remove_if(badAnimal);
通过使用合适的谓词,您会受益匪浅。这完全避免了手动循环,减少了错误的范围,有助于消除或至少定位问题的根源,因为只要谓词是正确的,您就可以相信这个习惯用法是正确的
bool badAnimal(ClassItem * item)
{
// return true if animal is to be removed
}
Items.remove_if(badAnimal);
我看这里没有潜在的断层。无论如何:
存在(IMHO)两个可能的问题:
if(!AnimalType.compare(L"tiger"))
这看起来可疑。什么是AnimalType
?如果(!AnimalType.compare(L“tiger”)本身没有变化,您真的希望if(!AnimalType.compare)(L“tiger”)
的值在迭代过程中发生变化吗
在任何情况下,它看起来像一个读取,因此不应该写入。它看起来是恒定的,因此不应该改变
然后: 这最好是:
if((*i)->IsAnimalType(L"tiger") && (*i)->IsHungry())
{
i = Items.erase(i);
}
else
{
++i;
}
然而,更好的方法是使用标准算法去除元素。我认为这里没有潜在的SEGFULT。无论如何:
存在(IMHO)两个可能的问题:
if(!AnimalType.compare(L"tiger"))
这看起来可疑。什么是AnimalType
?如果(!AnimalType.compare(L“tiger”)本身没有变化,您真的希望if(!AnimalType.compare)(L“tiger”)
的值在迭代过程中发生变化吗
在任何情况下,它看起来像一个读取,因此不应该写入。它看起来是恒定的,因此不应该改变
然后: 这最好是:
if((*i)->IsAnimalType(L"tiger") && (*i)->IsHungry())
{
i = Items.erase(i);
}
else
{
++i;
}
但是,更好的方法是使用标准的元素移除算法。如果你有一只不饿的
老虎会怎么样?无限循环,堆栈溢出,混乱…什么是AnimalType.compare(L“tiger”)?这段代码本身不应该出错。请给出完整的例子。@Ernon:我自己也在问这个问题。可能是我们只能猜测的错误原因。我道歉。基本上,if(!AnimalType.compare(AnimalType))将获取wstring AnimalType并运行正确的if语句。在本例中,我想检查老虎是否饿了,因此我将L“tiger”传递到我的函数中以运行适当的if语句。如果您有一只不饿的老虎,会发生什么?无限循环,堆栈溢出,混乱…什么是AnimalType.compare(L“tiger”)?这段代码本身不应该出错。请给出完整的例子。@Ernon:我自己也在问这个问题。可能是我们只能猜测的错误原因。我道歉。基本上,if(!AnimalType.compare(AnimalType))将获取wstring AnimalType并运行正确的if语句。在本例中,我想检查老虎是否饿了,所以我将L“tiger”传递到我的函数中以运行适当的if语句。然后问题仍然存在。为什么?调用erase()
后,循环中没有可执行的指令。。。。如果OP想把所有饥饿的老虎从名单上除名的话,休息是不必要的。但问题仍然存在。为什么?调用erase()
后,循环中没有可执行的指令。。。。如果OP想要从列表中删除所有饥饿的老虎,则不需要中断。@KarolyHorvath这是怎么回事?因为他的代码也不应该出现分段错误。或者换一种说法:为什么你认为会这样?@KarolyHorvath我并不真正关心OP的代码,而是关心他们试图做什么。@KarolyHorvath这至少有助于OP缩小可能发生SEGFULT的范围,避免不必要的错误。你看,如果你在答案中添加了所有这些信息,这本应该是完全好的,但因为你没有,我认为我发布了完全有效的评论。我只是想帮忙。真的。@KarolyHorvath这是怎么回事?因为他的代码也不应该出错。或者换一种说法:为什么你认为会这样?@KarolyHorvath我并不真正关心OP的代码,而是关心他们试图做什么。@KarolyHorvath这至少有助于OP缩小可能发生SEGFULT的范围,避免不必要的错误。你看,如果你在答案中添加了所有这些信息,这本应该是完全好的,但因为你没有,我认为我发布了完全有效的评论。我只是想帮忙。真正地