[STL] 注意erase() 和remove()

首先要理解STL中的两大类容器:

  链表容器:包括list、slist等这样基于节点的容器(动态分配内存块)和set、map、multiset、multimap等关联容器(平衡树实现)

  数组容器:指的是在一块连续的内存上保存元素的连续内存容器,比如vector、deque、string

erase()方法: 

  iterator erase(iterator _Where);  //从指定容器删除指定位置的元素,返回值是一个迭代器,指向删除元素下一个元素

  iterator erase(iterator _First,iterator _Last);  //从指定容器删除某段范围内的元素,返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;

正确使用erase()的方式一:

      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++;
      }

正确使用erase()的方式二:

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

  对于链表容器两种方式都可以,但是对于数组容器只能使用第一种方式,因为数组容器的erase()方法的实现会将后面的元素都逐个往前复制移动

原文地址:https://www.cnblogs.com/lihuixian001/p/2765296.html