c++ list erase()

STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。
      在使用 list、set 或 map遍历删除某些元素时可以这样使用:
正确使用方法1  :  

std::list< int> List;
      std::list< int>::iterator itList;
      for( itList = List.begin(); itList != List.end(); )
      {
            if( WillDelete( *itList) )
            {
               itList = List.erase( itList);
            }
            else
               itList++;
      }

正确使用方法2   : 

std::list< int> List;
      std::list< int>::iterator itList;
      for( itList = List.begin(); itList != List.end(); )
      {
            if( WillDelete( *itList) )
            {
               List.erase( itList++);
            }
            else
               itList++;
      }

下面是两个错误的使用方法:

      std::list< int> List;
      std::list< int>::iterator itList;
      for( itList = List.begin(); itList != List.end(); itList++)
      {
            if( WillDelete( *itList) )
            {
               List.erase( itList);
            }
      }

std::list< int> List;
      std::list< int>::iterator itList;
      for( itList = List.begin(); itList != List.end(); )
      {
            if( WillDelete( *itList) )
            {
               itList = List.erase( ++itList);
            }
            else
               itList++;
      }
  正确使用方法1:通过erase方法的返回值来获取下一个元素的位置
      正确使用方法2:在调用erase方法之前先使用 “++”来获取下一个元素的位置
      错误使用方法1:在调用erase方法之后使用“++”来获取下一个元素的位置,由于在调用erase方法以后,该元素的位置已经被删除,如果在根据这个旧的位置来获取下一个位置,则会出现异常。
      错误使用方法2:同上。

这里“++”运算符与我们平常的理解刚好相反,erase( itList++) 是先获取下一个元素的位置在删除; erase( ++itList) 是删除以后再获取下一个元素的位置。

时间: 2024-10-12 01:45:48

c++ list erase()的相关文章

QWidget的六个刷新函数(居然有QWidget::erase函数,且并不产生绘制事件)

Qt paintevent事件 一.主要理解一下几个方法和属性: 1.QWidget * QScrollView::viewport () const 2.void QWidget::paintEvent ( QPaintEvent * ) [虚 保护] 3.void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽] 4.void QWidget::update () [槽] 5.void QWidget

STL list 的insert()和erase()

list 类提供了insert(),erase()函数,它们分别增加和删除一个位于迭代器位置的元素. 1,  insert() iterator insert(iterator pos,const T &vaule); //在pos前插入vaule,返回新元素的迭代器,不影响现有迭代器. #include<iostream> using namespace std; #include<list> int main(void) { int a[5]={1,2,3,4,5};

map中erase函数的使用

STL的map表里有一个erase方法用来从一个map中删除掉指令的节点eg:map<string,string> mapTest;typedef map<string,string>::iterator ITER; ITER iter=mapTest.find(key);mapTest.erase(iter); 像上面这样只是删除单个节点,map的形为不会出现任务问题,但是当在一个循环里用的时候,往往会被误用,那是因为使用者没有正确理解iterator的概念.像下面这样的一个例子

vector::erase

转自http://www.cnblogs.com/xkfz007/archive/2012/08/17/2644061.html erase的返回值是一个迭代器,而这个迭代器就是指向删除之前元素后的第一个元素 erase把要删除的指针指向了指针的下一个位置 remove,这个函数可以将迭代器范围内的等于某个值的元素"删除" 这里的删除是不改变容器的大小,只是将一些不满足条件的元素前移 这样的话保留的元素都移到了容器的前面,而remove正好就指向要删除的第一个元素,而后面的就是要删除的

map/vector erase

问题核心:erase之后迭代器是否失效 vector调用erase之后,该迭代器之后的迭代器都失效: map调用erase之后,其他迭代器并不会失效. 1 vector<int> vecData; 2 for (typeof(vecData.begin()) it; it != vecData.end();) 3 { 4 if (*it == 1) 5 { 6 it = vecData.erase(it); 7 //vv.erase(it++); //vector erase之后,it迭代器后

map erase iterator

错误写法: map<int, int> m; for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) { m.erase(it); } 这样会导致程序行为不可知.因为map是关联容器,对于关联容器来说,如果某一个元素已经被删除,那么其对应的迭代器就失效了,不应该再被使用:否则会导致程序无定义的行为. 正确写法1(STL推荐写法): map<int, int> m; for (map<int

vector中insert/erase后指针失效问题

之前看<C++ Primier>的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究.今天写程序的时候遇到了这个问题. 1 小心冀冀地Erase 最初我的程序是酱紫的,别说话,我知道这样是有问题的,可这样是最直观的想法 vector<int> a; for (int i = 0; i < 10; ++i) { a.push_back(i); } for (auto it = a.begin(); it != a.end();++it ){

STL笔记(4)关于erase,remove

STL笔记(4)关于erase,remove 你要erase的元素很容易识别.它们是从区间的“新逻辑终点”开始持续到区间真的终点的原来区间的元素.要除去那些元素,你要做的所有事情就是用那两个迭代器调用erase的区间形式(参见条款5).因为remove本身很方便地返回了区间新逻辑终点的迭代器,这个调用很直截了当: vector<int> v;                        // 正如从前v.erase(remove(v.begin(), v.end(), 99), v.end(

C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法

C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法. C++ 中std::remove()并不删除元素,因为容器的size()没有变化,只是元素的替换. 1.std::vector::erase() 函数原型:iterator erase (iterator position); //删除指定元素 iterator erase (iterator first, iterator last); //删除指定范围内的元素 返回值:指向删除元素(或

C++ 容器 LIST VECTOR erase

在Vector中 做erase操作就是按照下面的步骤来做的: copy() destory(); 在list容器中 erase操作 destory() deallocate() Vector使用从某种意义上来说内存空间只是有增无减[如果不通过某种技术的话] 而list就像正常操作一样 该释放就释放 不改释放就不释放 Vector缩容的方法: 调用swap 这是真正释放内存的方法  a.swap(b)的方法来释放a以前的内存. swap也是有动作开销的 1个拷贝构造 加上2个复制操作符 不容小觑.