为了账号安全,请及时绑定邮箱和手机立即绑定

您能在迭代过程中从std:list中删除元素吗?

您能在迭代过程中从std:list中删除元素吗?

C++
尚方宝剑之说 2019-06-29 17:45:02
您能在迭代过程中从std:list中删除元素吗?我有这样的代码:for (std::list<item*>::iterator i=items.begin();i!=items.end();i++){     bool isActive = (*i)->update();     //if (!isActive)      //  items.remove(*i);      //else        other_code_involving(*i);}items.remove_if(CheckItemNotActive);我希望在更新后立即删除不活动的项目,以避免再次浏览列表。但是,如果我添加注释行,当我到达i++*“列表迭代器不可递增”。我尝试了一些没有在for语句中增加的交替语句,但是我没有得到任何工作。在您行走STD:List时,删除项目的最佳方法是什么?
查看完整描述

3 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

您必须先增加迭代器(使用I+),然后删除前一个元素(例如,使用I+返回的值)。您可以将代码更改为WITH循环,如下所示:

std::list<item*>::iterator i = items.begin();while (i != items.end()){
    bool isActive = (*i)->update();
    if (!isActive)
    {
        items.erase(i++);  // alternatively, i = items.erase(i);
    }
    else
    {
        other_code_involving(*i);
        ++i;
    }}


查看完整回答
反对 回复 2019-06-29
?
SMILET

TA贡献1796条经验 获得超4个赞

你想做的是:

i= items.erase(i);

这将正确地更新迭代器以指向您删除的迭代器之后的位置。


查看完整回答
反对 回复 2019-06-29
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

你需要把克里斯托的答案和MSN的答案结合起来:

// Note: Using the pre-increment operator is preferred for iterators because//       there can be a performance gain.//// Note: As long as you are iterating from beginning to end, without inserting//       along the way you can safely save end once; otherwise get it at the//       top of each loop.std::list< item * >::iterator iter = items.begin();std::list< item * >::iterator end  = items.end();while (iter != end){
    item * pItem = *iter;

    if (pItem->update() == true)
    {
        other_code_involving(pItem);
        ++iter;
    }
    else
    {
        // BTW, who is deleting pItem, a.k.a. (*iter)?
        iter = items.erase(iter);
    }}

当然,最有效和超酷的STL Savy是这样的:

// This implementation of update executes other_code_involving(Item *) if// this instance needs updating.//// This method returns true if this still needs future updates.//bool Item::update(void){
    if (m_needsUpdates == true)
    {
        m_needsUpdates = other_code_involving(this);
    }

    return (m_needsUpdates);}// This call does everything the previous loop did!!! (Including the fact// that it isn't deleting the items that are erased!)items.remove_if(std::not1(std::mem_fun(&Item::update)));


查看完整回答
反对 回复 2019-06-29
  • 3 回答
  • 0 关注
  • 2188 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信