迭代器的删除问题

来源:互联网 发布:阿里云国际版账号注册 编辑:程序博客网 时间:2024/05/23 20:24


    it = m_ballActionsMgr.begin();

    for (; it !=m_ballActionsMgr.end(); ++it)

    {

        if ((*it)->isFinished())

        {

            BallAction* act = *it;

            m_ballActionsMgr.erase(it);

            CC_SAFE_DELETE(act);

            break;

        }

    }


这样删除是正确的


 it = m_ballActionsMgr.begin();

    for (; it != m_ballActionsMgr.end(); ++it)

    {

        if ((*it)->isFinished())

        {

            m_ballActionsMgr.erase(it);

            BallAction* act = *it;

            CC_SAFE_DELETE(act);

            break;

        }

    }


这样删除有问题,删除迭代器以后,迭代器又加了1,所以删除的是下一个元素,这样的做法是不能一次性删除符合要求的元素


改进,先把符合要求删除的元素放在另外一个迭代器,然后再统一删除

vector<BallAction*>::iterator it =m_ballActionsMgr.begin();

    for (; it !=m_ballActionsMgr.end(); ++it)

    {

        BallAction* act = *it;

        act->updateData(dt);

        

        if (act->isFinished())

        {

            m_willDelActionsMgr.push_back(act);

        }

    }

    

    //把完成的动作删除

    vector<BallAction*>::iterator delIt =m_willDelActionsMgr.begin();

    for (; delIt !=m_willDelActionsMgr.end(); ++delIt)

    {

        vector<BallAction*>::iterator existIt =std::find(m_ballActionsMgr.begin(),

                                                         m_ballActionsMgr.end(),

                                                          *delIt);

        if (existIt !=m_ballActionsMgr.end())

        {

            m_ballActionsMgr.erase(existIt);

        }

    }

    

    delIt = m_willDelActionsMgr.begin();

    for (; delIt !=m_willDelActionsMgr.end(); ++delIt)

    {

        BallAction* act = *delIt;

        CC_SAFE_DELETE(act);

    }

    m_willDelActionsMgr.clear();


// 2014-01-22

今天总算搞明白了为什么会删除后一个内容,因为vector是数组,删除的时候,后面的元素会往前移动,所以就删除了后一个内容

以前遍历删除迭代器删除完之后都用break;

正确的方法,

for (std::vector<int>::iterator it = value.begin(); it != value.end();)

{

if (condition)

{

value.erase(it++);

}

else

{

it++;

}

}