std::list<int>::iterator it;
for(it = m_list.begin(); it != m_list.end(); it++)
{
  if( ((*it) > 100)&&((*it) < 200) )
    m_list.remove( (*it) );
}我的问题是 m_list.remove( (*it) ); 之后 it 会指向哪个元素?
需不需要调用 it--;像这样遍历 list , 删除一些元素, 正确的代码应该是怎么样的.

解决方案 »

  1.   

    std::list <int>::iterator it; 
    for(it = m_list.begin(); it != m_list.end(); it++) 

      if( ((*it) > 100)&&((*it) < 200) ) 
        m_list.erase(it); 
      

  2.   

    每次删除后再把迭代器指向begin()就行。
      

  3.   

    std::list <int>::iterator it; 
    for(it = m_list.begin(); it != m_list.end(); it++) 

      if( ((*it) > 100)&&((*it) < 200) ) 
        m_list.erase(it); 
      

  4.   


    void remove(const _Ty& _Val_arg)
    {
    const _Ty _Val = _Val_arg; // in case it's removed along the way
    iterator _Last = end();
    for (iterator _First = begin(); _First != _Last; )
    if (*_First == _Val)
    _First = erase(_First);
    else
    ++_First;
    }
    从源码看remove不满足你的要求,他会删除所有值为_Val_arg的元素, 而erase只删除一个,且删除后自动增加指向下个
    iterator erase(const_iterator _Where)
    { // erase element at _Where
    _Nodeptr _Pnode = (_Where++)._Mynode(); if (_Pnode != _Myhead)
    { // not list head, safe to erase
    _Nextnode(_Prevnode(_Pnode)) = _Nextnode(_Pnode);
    _Prevnode(_Nextnode(_Pnode)) = _Prevnode(_Pnode);
    this->_Alnod.destroy(_Pnode);
    this->_Alnod.deallocate(_Pnode, 1);
    --_Mysize;
    }
    return (_Make_iter(_Where));
    }