C++中STL容器利用迭代器删除元素小结

在STL容器中删除元素,容易导致迭代器失效,故应该清楚明白其用法,现在总结一下。
转载自:https://blog.csdn.net/yf_li123/article/details/75003425#comments

1.关联容器

对于关联容器(如map, set, multimap, multiset), 删除当前的iterator, 仅仅会使当前的iterator失效,只要在erase时,递增当前的iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入,删除一个结点不会对其他结点造成影响。使用方式如下例子:
一个例子

#include<iostream>
#include<set>
using namespace std;int main() {set<int> valset = { 1,2,3,4,5,6 };set<int>::iterator iter;for (iter = valset.begin(); iter != valset.end(); ) {if (*iter == 3)valset.erase(iter++);else if (*iter == 4)valset.erase(iter++);else if (*iter == 6)valset.erase(iter++);else++iter;}for (auto i : valset) cout << i << endl;return 0;
}

运行结果如下所示:

【注意】因为传给erase的是iter的一个副本,iter++是下一个有效的迭代器。

顺序容器

对于序列式容器(如vector,deque,list等),删除当前的iterator会使后面所有元素的iterator都失效。这是因为vector,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。不过erase方法可以返回下一个有效的iterator。使用方式如下,例如:

#include<iostream>
#include<vector>
using namespace std;int main() {vector<int> val = { 1,2,3,4,5,6 };vector<int>::iterator iter;for (iter = val.begin(); iter != val.end(); ) {if (*iter == 3)iter = val.erase(iter);     //返回下一个有效的迭代器,无需+1else if (*iter == 4)iter = val.erase(iter);     //返回下一个有效的迭代器,无需+1else if (*iter == 6)iter = val.erase(iter);     //返回下一个有效的迭代器,无需+1else++iter;}for (auto i : val)cout << i << endl;return 0;
}

运行结果如下所示:

C++中STL容器利用迭代器删除元素小结相关推荐

  1. STL 容器和迭代器连载8_访问顺序容器的元素

    2019独角兽企业重金招聘Python工程师标准>>> /*- ========================================================== ...

  2. C++ STL deque容器添加和删除元素方法完全攻略

    deque 容器中,无论是添加元素还是删除元素,都只能借助 deque 模板类提供的成员函数.表 1 中罗列的是所有和添加或删除容器内元素相关的 deque 模板类中的成员函数. 表 1 和添加或删除 ...

  3. java使用迭代器删除元素_使用Java从地图中删除元素

    java使用迭代器删除元素 关于从Java中的Map删除元素的非常简短的文章. 我们将专注于删除多个元素,而忽略了您可以使用Map.remove删除单个元素的Map.remove . 以下Map将用于 ...

  4. C++ [STL容器反向迭代器]

    本文已收录至<C++语言和高级数据结构>专栏! 作者:ARMCSKGT STL容器反向迭代器 前言 正文 适配器 反向迭代器 反向迭代器框架 默认成员函数 反向迭代器的遍历 反向迭代器的比 ...

  5. STL 容器和迭代器连载6_顺序容器的操作3

    2019独角兽企业重金招聘Python工程师标准>>> /*- ========================================================== ...

  6. java迭代器删除元素出异常_java迭代器移除元素出现并发修改异常的原因及解决...

    迭代器(Iterator的对象)主要用于遍历集合,体现的就是迭代器模式. Iterator接口定义了以下四种方法. boolean hasNext():如果集合还没遍历完就返回true. Object ...

  7. java迭代器删除元素_java迭代器中删除元素的操作

    我们知道通过Iterator,可以对集合中的元素进行遍历.那么在其中遇到我们不需要的元素时,可不可以在遍历的时候顺便给删除呢?答案是当然可以.在Iterator下有一个remove函数,专门用于删除的 ...

  8. java迭代器删除元素_java迭代器中删除元素的实例操作详解

    java迭代器中删除元素的实例操作详解 2021-01-21 16:40:08 我们知道通过Iterator,可以对集合中的元素进行遍历.那么在其中遇到我们不需要的元素时,可不可以在遍历的时候顺便给删 ...

  9. MFC中STL容器中Vector,List,Map基本用法汇总

    容器就是数据结构的泛指,迭代器就是指针的泛指,可以指向元素.它可以用来存储数据,就比如杯子用来装水一样.而STL中的容器有很多,它包括vector,list,map,deque,set等.我就简单列举 ...

最新文章

  1. 十折交叉验证10-fold cross validation, 数据集划分 训练集 验证集 测试集
  2. python encodings模块_ImportError:没有名为'encodings'的模块
  3. Boost:宏BOOST_TEST_EQ的测试
  4. qtchart实时动态曲线_极致新体验,实时、无损、长时程细胞分析检测平台
  5. qt vs插件 qt-vsaddin下载
  6. HDU - 6769-In Search of Gold-二分+树形dp
  7. mysql workbench入门_5分钟入门MySQL Workbench
  8. Android GridLayout 网格布局
  9. CSS color设置与调色板
  10. 安装IIS8.0,ASP以及相关配置,网站搭建
  11. 网页中插入背景音乐代码(html)
  12. 状态良好(恢复分区)空间的删除的方法
  13. Excel导入导出之easypoi用法
  14. AlphaTest烘焙的阴影不正确
  15. [原创]分析某app直播地址的过程
  16. java pdf库_Java中常用的操作PDF的类库
  17. Java 面向对象(六)
  18. 痴情不是罪过 忘情不是洒脱
  19. 6.14 PowerBI系列之DAX函数专题-重点之集合函数UNION、INTERSECT、 except、crossjoin、generate
  20. 刻录原版系统光盘(用软碟通)

热门文章

  1. MCPTAM标定部分 运行结果
  2. python输出语句格式 f_Python基础之输出格式和If判断
  3. amd与matlab,AMD CPU在MATLAB上的表现实测
  4. 如何查看python的工作目录_Python3基础 os listdir curdir查看当前工作目录的所有文件的名字...
  5. 原生编辑器_微信小程序 广告原生模板广告
  6. video safari不支持吗_您支持吗? 公园遛狗纳入 “不文明行为黑名单”
  7. 开课吧python是针对哪些人的_为什么越来越多的人选择学习Python?开课吧告诉你答案...
  8. oracle catalog命令,catalog 命令
  9. nginx如何编译安装mysql_centos系统编译安装nginx+php环境另加独立mysql教程
  10. 数据接口请求异常:error_springboot2.2.X手册:构建多元化的API接口,我们这样子设计