Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迭代时在列表中删除项时出现问题_C++ - Fatal编程技术网

C++ 迭代时在列表中删除项时出现问题

C++ 迭代时在列表中删除项时出现问题,c++,C++,好的,我有一个STL参考列表,我正在迭代。此函数有三个等效部分。该函数将wstring作为参数,并运行相应的if语句。我已将代码缩减为一个if语句,以尝试使其正常工作 所以,我检查以查看作为参数传入的内容。然后我检查分类项目是否是某种动物。如果它饿了,我检查它是否饿了,并将其从列表中删除。我现在只是想避免seg故障,但似乎做不到 list<ClassItem *>::iterator i = Items.begin(); while(i != Items.end()

好的,我有一个STL参考列表,我正在迭代。此函数有三个等效部分。该函数将wstring作为参数,并运行相应的if语句。我已将代码缩减为一个if语句,以尝试使其正常工作

所以,我检查以查看作为参数传入的内容。然后我检查分类项目是否是某种动物。如果它饿了,我检查它是否饿了,并将其从列表中删除。我现在只是想避免seg故障,但似乎做不到

    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的范围,避免不必要的错误。你看,如果你在答案中添加了所有这些信息,这本应该是完全好的,但因为你没有,我认为我发布了完全有效的评论。我只是想帮忙。真正地