list删除元素

来源:互联网 发布:如何用手机注册淘宝号 编辑:程序博客网 时间:2024/04/30 10:16
 常用的删除容器中元素的方法是如下(方法1):
      list< int> List;      list< int>::iterator iter;      for( iter = List.begin(); iter != List.end(); )      {            if(1)              {               iter = List.erase( iter );            }            else            {               iter++;            }      }



      也可以这样写(方法2):      list< int> List;      list< int>::iterator iter;      for( iter = List.begin(); iter != List.end(); )      {            if(1)              {               List.erase( iter++ );            }            else            {               iter++;            }      }


有一种错误的写法(注意同方法2比较)
     list< int> List;      list< int>::iterator iter;      for( iter = List.begin(); iter != List.end(); )      {            if(1)              {               List.erase( iter );            }            iter++;      }



我们看一下erase()函数的源代码(仅列出release下的代码)。
        iterator erase(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 (_Where);        }



函数在返回的时候,是返回当前迭代器的下一个节点。所以当 iter = List.erase( iter ); 执行以后,迭代器自动指向了下一个元素。而对于入参中的iter,所指的地址已经被销毁,所以写的时候,应该注意加上前面的iter =
那另外的一种写法,List.erase( iter++ ); 为什么也是对的呢?


        _Myt_iter& operator++()               {    // preincrement            ++(*(_Mybase_iter *)this);            return (*this);            }        _Myt_iter operator++(int)             {    // postincrement            _Myt_iter _Tmp = *this;            ++*this;            return (_Tmp);            }




0 0
原创粉丝点击