遍历中stl erase 的使用

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方法也会返回下一个有效的迭代器,因此,以上两种方法都可以使用。

时间: 2024-09-09 04:59:50

遍历中stl erase 的使用的相关文章

二叉树的应用-先序遍历中序遍历还原二叉树

二叉树的一些应用 还是大实验要求的 还有已知先序遍历 中序遍历求后续遍历 #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAX 100 //节点个数 #define Null 0 typedef int Elemtype; class node { public: Elemtype data; no

Java中Collection遍历中删除、合并元素

我的分词结果链表需要合并连续的数字和日期,所以需要熟悉一下Java Collection在遍历的过程中同时删除.合并元素的小trick.自己试验了一下,活用listIterator的previous()和next()方法就可以达到目的. 遍历中删除 数据集 List<Integer> integerList = new LinkedList<Integer>(); for (int i = 1; i <= 10; ++i) {     integerList.add(i);

如何在遍历中使用iterator及reverse_iterator删除元素

众所周知,在使用迭代器遍历 STL 容器时,需要特别留意是否在循环中修改了迭代器而导致迭代器失效的情形.下面我来总结一下在对各种容器进行正向和反向遍历过程中删除元素时,正确更新迭代器的用法.本文完整源码:https://code.csdn.net/snippets/173595 首先,要明白使用正向迭代器(iterator)进行反向遍历是错误的用法,要不干嘛要有反向迭代器呢(reverse_iterator).其次,根据容器的特性,遍历删除操作的用法可以分为两组,第一组是 list 和 vect

STRUTS2标签遍历中 href属性通过后台获取值不正确

问题描述 <s:iterator value="#init.focus" var="bulletin"> <li> <s:if test="#bulletin.strong"> <s:a cssClass="link3" href="#bulletin.url"><strong><s:property value="#bulleti

linux中stl模版的用法1

/* 模版成员模版 */ #include<iostream> using namespace std; template<typename V> class Value { public: Value(const V& v):m_v(v){} V m_v; }; template<typename K> class Key { public: Key(const K& k):m_k(k){} K m_k; template<typename V&

vevtor-关于STL vector的遍历问题,请问怎样一边操作一边遍历删除?

问题描述 关于STL vector的遍历问题,请问怎样一边操作一边遍历删除? #include #include #include #include #include using namespace std; typedef struct rect { int id; int length; int width; }Rect; vector vec; void * add(void *argc) { int i; Rect r; while(1){ sleep(1); for(i=0;i<10;

二叉树的遍历详解(前序中序后序层次-递归和非递归)

二叉树 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁.而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现.在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点 前序遍历 前序遍历按照"根结点-左孩子-右孩子"的顺序进行访问. 递归实现 void PreOrder(Tree

二叉树前序、中序、后序遍历相互求法

今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看看前序.中序.后序遍历的特性:  前序遍历:      1.访问根节点      2.前序遍历左子树      3.前序遍历右子树  中序遍历:      1.中序遍历左子树      2.访问根节点      3.中序遍历右子树  后序遍历:      1.后序遍历左子树      2.后序遍历右

C++中的树、二叉树、二叉树遍历、二叉树前序、中序、后序遍历相互求法

本博文来总结下树.二叉树以及二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 1.什么是树?什么是二叉树? 树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合. 二叉树是指结点的度不超过2的有序树. (结点的度:树中的一个结点拥有的子树数目.) 2.二叉树的前序.中序.后序遍历的特性  二叉树前序遍历特性:   (1).访问根节点  (2).前序遍