码迷,mamicode.com
首页 > 其他好文 > 详细

STL容器之 元素删除

时间:2015-05-12 15:37:40      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:

 stl容器的元素删除跟具体的按内存分配方式关系密切。按内存分配方式可以分为节点内存容器和连续内存容器。


节点内存容器指的是一种表现方式,包括list、slist等这样基于节点的容器(链表实现)和set、map、multiset、multimap等关联容器(平衡树实现)

连续内存容器指的是在一块连续的内存上保存元素的连续内存容器,比如vector等。


1、节点内存容器

以list为例,当调用erase函数之后,被删除的元素的迭代器将会失效,则需要在删除之前移动迭代器,并传入原来迭代器的拷贝作为erase函数的参数。


方式一:

使用后置++函数,代码如下:

list<int>::iterator it; 
  for (it = lt.begin(); it != lt.end(); ) {
    if (*it % 2 == 0)
      lt.erase(it++); //后置++操作符函数返回的是移动前的迭代器的拷贝
    else
      ++it;
  }

方式二:
使用链表容器使用erase删除节点将会返回下一个元素的地址,代码如下:
list<int>::iterator it; 
  for (it = lt.begin(); it != lt.end(); ) {
    if (*it % 2 == 0)
      it = lt.erase(it);//自动返回下一个元素的地址,不用再主动前移指针
    else
      ++it;
  }

2、连续内存容器

以vector为例,当调用erase函数时,迭代器指向的元素被删除了,但是被删元素后面所有的元素会被前移(具体参考STL源码), 因此迭代器会自动指向下一个元素。

代码如下:

vector<int>::iterator it = v.begin();
  for (it = v.begin(); it != v.end(); ) { 
    if (*it % 2 == 0)
      v.erase(it);//删除元素后,后面元素自动往前移,不用挪动指                  
    else
      ++it;
  }



STL容器之 元素删除

标签:

原文地址:http://blog.csdn.net/chenjiayi_yun/article/details/45645005

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!