迭代器删除操作写法及解释
来源:互联网 发布:慢慢减肥知乎 编辑:程序博客网 时间:2024/05/22 02:06
1 迭代器是什么?
迭代器是一种典型的设计模式,与集合配套使用,其目的是隐藏集合中的内部成员,并且提供对集合成员的访问能力。其结构如下图所示;
具体协作关系及实现方式,就不在此赘述了。
2 在迭代器上执行删除操作
下面以删除list中所有给定值的元素为例,介绍迭代器的一种常见写法及原理解释。
错误写法:
- std::list<int>::iterator it = listVar.begin();
- while(it != listVar.end())
- {
- // 相等,则删除当前位置并后移
- if (*it == iVar)
- {
- listVar.erase(it); // 删除当前位置
- it++; // 向后移动
- }
- // 不相等,则向后移动
- else
- {
- it++;
- }
- }
正确写法一:
- std::list<int>::iterator it = listVar.begin();
- std::list<int>::iterator = listVar.end();
- while(it != listVar.end())
- {
- // 相等,则删除当前位置并后移
- if (*it == iVar)
- {
- itNext = it;
- itNext++; // 先获取到当前位置的下一个位置
- listVar.erase(it); // 删除当前位置
- it = itNext; // 将下一个位置赋值给it
- }
- // 不相等,则向后移动
- else
- {
- it++;
- }
- }
在删除指定位置前,此时迭代器是有效的,先获取其下一个位置,然后删除当前位置,最后再将下一位置赋值给当前迭代器。这个方法是可行的,但是写法很冗余,其实这几步,一行就可以搞定
正确写法二:
- while(it != listVar.end())
- {
- // 相等,则删除当前位置并后移
- if (*it == iVar)
- {
- listVar.erase(it++); // 删除当前位置并后移
- }
- // 不相等,则向后移动
- else
- {
- it++;
- }
- }
相信大家在平时写代码时也都是这么用的,但为什么这样写可行,可能有些同学就说不清楚了。
首先,it++是一个函数调用,其调用的函数为迭代器的operator++()方法,该方法将迭代器自身向后移动一个位置,同时其返回当前位置。
然后,erase执行时,传递进来的迭代器是当前位置的拷贝的一个临时迭代器,而it此时已经指向下一个位置了。
0 0
- 迭代器删除操作写法及解释
- CRC校验解释及编程写法
- IOS 方法带可变参数写法及解释
- ACCESS 日期查询及操作SQL语句的写法
- ACCESS 日期查询及操作SQL语句的写法
- Swift 4.0中 GCD定时器写法,及延时操作
- 创建类及删除类操作
- Java--文件操作,删除文件及文件夹
- B+树的插入及删除操作
- Thinkphp数据的修改及删除操作
- Spring data jpa HQL @Query 自定义查询及更新删除 及 sql写法
- 二叉树常用操作算法集、解释及注意事项
- [Linux Input]BITS_TO_LONGS的解释及相关为操作函数
- 【opencv2操作之HoughLinesP参数解释及实例展示】
- [Linux Input]BITS_TO_LONGS的解释及相关为操作函数
- 二叉树常用操作算法集、解释及注意事项
- 二叉树常用操作算法集、解释及注意事项
- vi基本操作(4) -- 复制、粘贴、删除及范围操作
- serialVersionUID作用
- 构建高可用和弹性伸缩的KV存储系统
- 移植QT到ZedBoard(制作运行库镜像) 交叉编译
- 准备写博客了~~
- java线程学习
- 迭代器删除操作写法及解释
- iptables
- 排序(三):直接选择排序
- Ubuntu 12.04 安装MySQL 5.6.21
- ZEDBOARD启动自启配置(加载镜像)
- 设计模式(十三)之 Memento(备忘机制)
- [软工视频]理论学习——概论、计划、需求分析、设计
- 获取中断描述符表IDT的信息
- 第11周 项目2-求最大公约数(3)