list删除元素

 常用的删除容器中元素的方法是如下(方法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);
            }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MyObject-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值