遍历中stl erase 的使用

来源:互联网 发布:vs2010mfc编程入门 编辑:程序博客网 时间:2024/05/01 17:15

vector(deque)是一个顺序容器,erase后,后面的元素自动前移,后面所有迭代器失效(地址前移)

对顺序容器的erase正确操作方法是使用erase的返回值,erase返回被删元素的下一个元素地址。

 // 假设vec中只存放一个值

iterator container::erase(iterator pos)

for(; iter != vec.end(); ) // iter: 0x0a3642d8    end(): 0x0a3642dc  {   if(//条件为真)    {       iter = vec.erase(iter); // iter: 0x0a3642d8  end():0x0a3642d8    }    else    {       ++iter;    }}


对关系容器的erase可以使用使用后置++的方法进行。因为此类采用红黑树实现,插入删除一个节点不会对其它节点产生影响。

传给erase的是iter的一个副本,void erase(iterator __pos),iter++会指向下一个元素

void container::erase(iterator pos)

for(; iter != _map.end(); ){   if(//条件为真)         {               _map.erase(iter++);         }         else         {              ++iter;         }}


对于list来说,它使用了不连续分配的内存,并且它的erase方法也会返回下一个有效的迭代器,因此,以上两种方法都可以使用。