C++ 列出要删除最后一个元素的迭代器

C++ 列出要删除最后一个元素的迭代器,c++,list,iterator,C++,List,Iterator,删除列表中的最后一个元素时出现问题。出于某种原因,它会删除倒数第二个元素。这个网站上有一篇非常有用的关于如何做到这一点的帖子,它让我走了这么远,但我仍然有问题。我只是不太明白这怎么不起作用 如果将iter++更改为++iter,则在删除最后一个元素时,尝试访问无效信息时会出现错误 std::list<Recipe>::iterator iter = recipes.begin(); while(iter != recipes.end() ) { if(iter->Ge

删除列表中的最后一个元素时出现问题。出于某种原因,它会删除倒数第二个元素。这个网站上有一篇非常有用的关于如何做到这一点的帖子,它让我走了这么远,但我仍然有问题。我只是不太明白这怎么不起作用

如果将
iter++
更改为
++iter
,则在删除最后一个元素时,尝试访问无效信息时会出现错误

std::list<Recipe>::iterator iter = recipes.begin();

while(iter != recipes.end() )
{
    if(iter->GetName() == buffer)
    {
        recipes.erase(iter++);
    }
    else
    {
        iter++;
    }

}
std::list::iterator iter=recipes.begin();
while(iter!=recipes.end())
{
if(iter->GetName()==缓冲区)
{
配方.擦除(iter++);
}
其他的
{
iter++;
}
}

<> P>>任何帮助?

< P>当你在C++中调用一个迭代器时,它将作为一个迭代器无效,你不应该这样做…< /P> 使用erase是正确的,但应将erase分配给iter,因为erase会将迭代器返回给下一个元素:

iter = recipes.erase(iter);
因此,该代码应该可以工作:

while(iter != recipes.end() )
{
    if(iter->GetName() == buffer)
    {
        iter = recipes.erase(iter);
    }
    else
    {
        iter++;
    }

}


现在很可能是,您的等式是不正确的,我们不知道缓冲区是什么,或者GetName()返回什么,您可能有两个吗 使用erase是正确的,但应将erase分配给iter,因为erase会将迭代器返回给下一个元素:

iter = recipes.erase(iter);
因此,该代码应该可以工作:

while(iter != recipes.end() )
{
    if(iter->GetName() == buffer)
    {
        iter = recipes.erase(iter);
    }
    else
    {
        iter++;
    }

}


现在很可能是,您的等式是不正确的,我们不知道缓冲区是什么,或者GetName()返回什么,您可能有两个吗

有用的帖子是什么?代码看起来不错。不过,更好的方法是使用
recipes.remove([buffer](Recipe const&r){return r.GetName()==buffer;})
GetName
是否返回
字符串
?如果是,可以使用strcmp或
std::string::compare
?比较很好。我不确定是否应该使用“删除”或“擦除”?我真的不知道有什么区别?我再也找不到有用的帖子了。有用的帖子是什么?代码看起来不错。不过,更好的方法是使用
recipes.remove([buffer](Recipe const&r){return r.GetName()==buffer;})
GetName
是否返回
字符串
?如果是,可以使用strcmp或
std::string::compare
?比较很好。我不确定是否应该使用“删除”或“擦除”?我真的不知道有什么区别?我再也找不到有用的帖子了。@Bill Erase返回一个迭代器,指向刚删除的元素之后的下一个元素。.不需要增加,应该可以。这仍然会删除倒数第二个元素。这个比较很好用。。它只是在删除列表的最后一个元素时出现问题。我发现了问题。谢谢试图访问保存此信息的列表框时,我使用了错误的消息。@Bill Erase返回一个迭代器,指向刚删除的元素之后的下一个元素。无需递增,这应该可以正常工作。这仍然会删除倒数第二个元素。这个比较很好用。。它只是在删除列表的最后一个元素时出现问题。我发现了问题。谢谢我试图访问保存此信息的列表框时使用了错误的消息。