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

众所周知,在使用迭代器遍历 STL 容器时,需要特别留意是否在循环中修改了迭代器而导致迭代器失效的情形。下面我来总结一下在对各种容器进行正向和反向遍历过程中删除元素时,正确更新迭代器的用法。本文完整源码:https://code.csdn.net/snippets/173595

首先,要明白使用正向迭代器(iterator)进行反向遍历是错误的用法,要不干嘛要有反向迭代器呢(reverse_iterator)。其次,根据容器的特性,遍历删除操作的用法可以分为两组,第一组是 list 和 vector,第二组是 map 和 set。

接下来,看看具体怎么个用法。

第一种情形:正向遍历删除元素

对 list 和 vector 来说,它们的 erase 函数会返回下一个迭代器,因此在遍历时,只需要 it = c.erase(it); 即可。

对 map 和 set 来说,它们的 erase 函数返回的 void,而在进行 erase 之后,当前迭代器会失效,无法再用于获取下一个迭代器。因此需要 erase 之前就获取指向下一个元素的迭代器。如:

tmpIt = it;

++it;

c.erase(tmpIt);

利用后缀++操作符的特性(先创建副本,然后再递增迭代器,然后返回副本)上面的三行代码可以简化为一行:

c.erase(it++);

下面来看实例:

list 正向遍历删除元素示例(vector 用法相同)

// erase with iterator
    list<int>::iterator it;
    for (it = l.begin(); it != l.end();)
    {
        if (0 == (*it) % 2) {
            it = l.erase(it);
        }
        else {
            ++it;
        }
    }

map 正向遍历删除元素示例(set 用法相同)

// erase with iterator
    map<int, int>::iterator mit;
    for (mit = m.begin(); mit != m.end();)
    {
        if (0 == mit->first % 2) {
            m.erase(mit++);
        }
        else {
            ++mit;
        }
    }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索迭代器
, iterator
, 迭代
, 元素
, erase
, 遍历元素
, 正向
, 反向
, stl迭代器失效
, 遍历删除
, 遍历删除出错
, 迭代器遍历
, map用法
反向迭代
iterator 遍历 删除、iterator删除元素、reverse iterator、c reverse iterator、listreverseiterator,以便于您获取更多的相关知识。

时间: 2024-11-01 21:11:42

如何在遍历中使用iterator及reverse_iterator删除元素的相关文章

JSP中c:foreach遍历和s:iterator遍历异同实例分析_JSP编程

本文实例分析了JSP中c:foreach遍历和s:iterator遍历的异同.分享给大家供大家参考.具体如下: ①jstl c:foreach 首先我们来看一个普通的servlet: import com.xy.entity.Board; import com.xy.entity.Topic; import com.xy.entity.User; public class ToMainAction extends HttpServlet { private IBoarderDao boardDa

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

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

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

二叉树的一些应用 还是大实验要求的 还有已知先序遍历 中序遍历求后续遍历 #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

jsp中使用iterator的内容无法显示出来,代码中哪里出现错误,见图

问题描述 jsp中使用iterator的内容无法显示出来,代码中哪里出现错误,见图 <%@ page language="java" import="java.util.*" pageEncoding="gbk"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//D

Java 遍历Map时 删除元素

package net.nie.test; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class HashMapTest { private static Map<Integer, String> map=new HashMap<Integer,String>(); /** 1.HashMap 类映射不保证顺序:某些映射可明确保证其顺序: TreeMap 类 *

STL中用erase()方法遍历删除元素

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

Java如何在List或Map遍历过程中删除元素_java

遍历删除List或Map中的元素有很多种方法,当运用不当的时候就会产生问题.下面通过这篇文章来再学习学习吧. 一.List遍历过程中删除元素 使用索引下标遍历的方式 示例:删除列表中的2 public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(2); list.add(3); list.add(

微软面试题解析:求一个矩阵中最大的二维矩阵(元素和最大)

题目:求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 0 3 4 2 3 4 5 1 1 1 5 3 0 中最大的是: 4 5 5 3 要求:(1)写出算法;(2)分析时间复杂度;(3)用C写出关键代码 分析: 直接遍历二维数组,求出最大的二维数组就OK了 实现如下: #include<iostream> using namespace std; int max_matrix(int (*array)[5], int maxx, int maxy, int& posi, int

单链表中查找结点p并删除结点p

问题描述 单链表中查找结点p并删除结点p pointer *p*q=NULL; p=find(headi+1); cout<data< q->next=p; q->next=p->next; delete p; } 网上的实现方法都是删除p的后继结点,我想直接删除p,按照我的想法上述语句应该是正确的,但是执行时候在q->next=p出显示又断点,怎么破 大神救我 解决方案 你应该从头结点开始遍历比如说头结点为 L:假设你要删的结点为p设置一个 q=L;m=q->n