【c++】map 迭代器删除示例

C++ STL中的map是非常常见的。通常我们用如下方式来遍历,并且删除map中的一些entry:

map<int, int> mp;
mp.insert(make_pair(1,1));
mp.insert(make_pair(2,3)); // insert some elements
for (map<int, int>::iterator iter = mp.begin(); iter != mp.end(); iter++) {
    if (iter->first == 1) mp.erase(iter); // NOTE it is not safe!
    else iter->second++;
}

上面的删除并不安全,因为mp.erase(iter) 之后,iter 的结构已经改变了,此时 for 循环张的 iter++ 可能会出现问题。因此推荐下面的改法:

for (map<int, int>::iterator iter = mp.begin(); iter != mp.end(); ) {
    if (iter->first == 1) mp.erase(iter++); // NOTE it is SAFE!
    else iter->second++;
}

这里的删除时安全的,因为iter在删除前已经会先进行缓存一下,再传给erase去删除。因此 iter++ 是在原先的 iter 基础上进行的。这种方式也是 C++ 文档中推荐的方式。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 22:59:08

【c++】map 迭代器删除示例的相关文章

【安卓笔记】滑动删除示例

本文将使用上篇文章介绍的Scroller类来完成一个比较常见的效果--滑动删除效果. 代码如下: simpleSwipeListView: package cn.edu.chd.simpleswipelistview; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.v

迭代器删除自己

迭代器删除自己 如果是 java, 迭代器删除自己, 只要简单的 iter.remove; list<int> l; l.push_back(1); l.push_back(3); l.push_back(4); std::list<int>::iterator iter; std::list<int>::iterator tmp_iter; for (iter = l.begin(); iter != l.end(); iter++) { if (*iter == 3

javascript里面的数组,json对象,动态添加,修改,删除示例

1 <!DOCTYPE html> 2 3 <html> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 6 <title>javascript里面的数组,json对象,动态添加,修改,删除示例</title> 7 <script src="http://ajax.go

HashSet源码解析&amp;Map迭代器

今天的主角是HashSet,Set是什么东东,当然也是一种java容器了. 那么今天的HashSet它又是怎么一回事的,他的存在又是为了解决什么问题呢? 先来看下Set的特点:Set元素无顺序,且元素不可以重复. .想到了什么?无顺序,由于散列的缘故:不可重复,HashMap的key就是不能重复的.是的,你有想对了.HashSet就是基于HashMap的key来实现的,整个HashSet中基本所有方法都是调用的HashMap的方法.利用HashMap可以实现两个卖点:1.不可重复,2.快速查找(

Java 遍历Map时 删除元素

1 package net.nie.test; 2 3 import java.util.HashMap; 4 import java.util.Iterator; 5 import java.util.Map; 6 7 public class HashMapTest { 8 private static Map<Integer, String> map=new HashMap<Integer,String>(); 9 10 /** 1.HashMap 类映射不保证顺序:某些映射

给jdk写注释系列之jdk1.6容器(6)-HashSet源码解析&amp;Map迭代器

今天的主角是HashSet,Set是什么东东,当然也是一种java容器了. 现在再看到Hash心底里有没有会心一笑呢,这里不再赘述hash的概念原理等一大堆东西了(不懂得需要先回去看下HashMap了),需要在啰嗦一句的是hash表是基于快速存取的角度设计的,也是一种典型的空间换时间的做法(这个在分析HashMap中都有讲过).那么今天的HashSet它又是怎么一回事的,他的存在又是为了解决什么问题呢? 先来看下Set的特点:Set元素无顺序,且元素不可以重复. .想到了什么?无顺序,由于散列的

STL 中 使用迭代器删除元素的问题

在vector中删除,大家都知道,直接erase的话,这种写法很有问题.因为erase(iter)之后iter指针就变成野指针了,此时继续iter++就会出问题. 1 for(auto iter = v.begin(), iter!=v.end(); iter++) 2 { 3 if(iter == 3) 4 v.erase(iter); 5 } 因此vector中正确的删除的方法是: for(auto iter = v.begin(), iter!=v.end(); /*iter++*/) {

遍历map和删除map中的一个entry

一.最常见的,需要key和value都需要时 public static void main(String[] args) { Map<Integer,Integer> map = new HashMap<Integer,Integer>(); map.put(33, 333); map.put(22, 222); map.put(11, 111); for(Map.Entry<Integer, Integer> entry:map.entrySet()){ Syste

Map迭代器两种遍历方式

/* map接口中没有迭代器,那么该怎么遍历? 1:Set<K> keySet() :获取到所有的键,存储到一个Set集合中,并返回该集合,因为Set有迭代器, 每次迭代出来的是一个键,再根据键来得到值 2:Set<Map.Entry<K,V>> entrySet():获取到所有的键值对儿形成的映射关系,存到一个Set集合中,再迭代这个集合 每次迭代出来的是一个映射关系,从这个映射关系中既可以得到键,也可以得到值 这种映射关系是Map.Entry<K,V>类