【经验】STL的list vector在iterator迭代器的循环中 使用erase 造成的BUG
#include <iostream>
#include <list>
#include <vector>
using namespace std;
typedef unsigned char BYTE;
typedef unsigned int UINT32;
typedef unsigned short UINT16; struct Datastruct{
BYTE type;
UINT16 length;
UINT32 value;
void show(){
//cout<<" type ="<<type;
//C++就是这样烦人 打印出的是字符[char] 非数值 //要想以数值的形式打印 需要进行强制类型转换
//cout.setf(ios::hex,ios::basefield);//设置十六进制显示数值
//cout.setf(ios::showbase|ios::uppercase);//设置0x头和大写
cout<<" type ="<<(int)type;
//printf(" type =",type);//还是C语言方便
cout<<" length="<<length;
cout<<" value ="<<value<<endl;
}
};
list<Datastruct> datalist;
void data_init(){
Datastruct data;
data.type=;
data.length=;
data.value=;
datalist.clear();
for(int i=;i<;i++){
data.value+=i;//1 2 4 7
datalist.push_back(data);
}
}
void data_show(){
for(list<Datastruct>::iterator datait=datalist.begin();datait!=datalist.end();datait++){
datait->show();
}
}
int main(int argc,char **argv)
{
//初始化 list
data_init(); data_show();
//删除 value是偶数的 BUG:删除不完全 因为erase,只循环了2次
for(list<Datastruct>::iterator datait=datalist.begin();datait!=datalist.end();datait++){
if(datait->value%==){
datait=datalist.erase(datait);
}
}
cout<<"================================"<<endl;
data_show();
data_init(); //删除 value是偶数的 BUG:删除不完全 因为erase,只循环了2次
for(list<Datastruct>::iterator datait=datalist.begin();datait!=datalist.end();datait++){
if(datait->value%==){
datait=datalist.erase(datait);
datait--;
}
}
cout<<"================================"<<endl;
data_show(); return ;
}
/*********
type =1 length=7 value =1
type =1 length=7 value =2
type =1 length=7 value =4
type =1 length=7 value =7
================================
type =1 length=7 value =1
type =1 length=7 value =4
type =1 length=7 value =7
================================
type =1 length=7 value =1
type =1 length=7 value =7 ***********/
最关键的代码:
datait=datalist.erase(datait);
其实,后面跟一个 it -- ; 指向前一个 ,再配合 for循环里面的 it++ ,才能保证正确性!
由于不清楚 STL的源码中到底怎么处理 迭代器的.所以 造成 使用不当。 在www.cplusplus.com 中的erase例子 不够好,配合源码 以及经常更新的例子 才能让我们更加理解其工作原理。
【经验】STL的list vector在iterator迭代器的循环中 使用erase 造成的BUG的更多相关文章
- vector容器+iterator迭代器
关于vector容器的详细描述,可参考:http://www.jb51.net/article/41648.htm 关于iterator迭代器的描述,可参考http://www.cppblog.c ...
- java基础(18):集合、Iterator迭代器、增强for循环、泛型
1. 集合 1.1 集合介绍 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数 ...
- 集合和Iterator迭代器
集合 集合是java中提供的一种容器,可以用来存储多个数据. 注意: ①.集合只能存放对象.比如你存一个 int 型数据 1放入集合中, 其实它是自动转换成 Integer 类后存入的,Java中每一 ...
- 实战c++中的vector系列--vector的遍历(stl算法、vector迭代器(不要在循环中推断不等于end())、operator[])
遍历一个vector容器有非常多种方法.使用起来也是仁者见仁. 通过索引遍历: for (i = 0; i<v.size(); i++) { cout << v[i] << ...
- STL之iterator(迭代器)
3.迭代器简单介绍 除了使用下标来訪问vector对象的元素外,标准库还提供了訪问元素的方法:使用迭代器.迭代器是一种检查容器内元素而且遍历元素的数据类型. 百科释义: 迭代器(iterator)是一 ...
- vector的 emplace 和 insert 以及使用vector进行iterator遍历 且 erase的时候注意事项
vector<int> first;//Size()==2 first.push_back(); first.push_back(); //first.insert(2); vector& ...
- C++ Iterator迭代器介绍及Iterator迭代器用法代码举例
C++ Iterator迭代器介绍 迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针.举一个例子,你可用一个迭代器来实现对vector容器中所含元素的遍历.有这么几种迭代器如下: 迭代 ...
- STL源代码分析--迭代摘要、迭代器失效汇总
Vector 1.内部数据结构:连续存储,比如数组. 2.随机訪问每一个元素,所须要的时间为常量. 3.在末尾添加或删除元素所需时间与元素数目无关,在中间或开头添加或删除元素所需时间随元素数目呈线性变 ...
- C++标准模板库(STL)之Vector
在C中,有很多东西需要自己实现.C++提供了标准模板库(Standard Template Libray,STL),其中封装了很多容器,不需要费力去实现它们的细节而直接调用函数来实现功能. 具体容器链 ...
随机推荐
- 实现C语言字符串操作的库函数 包括基本的字符串复制 字符串长度 字符串比较等多种函数(C代码)
头文件 "mystring.h" #ifndef _MYSTR_H #define _MYSTR_H #include <stdio.h> #include <s ...
- P1375 小猫(二飞的小憨猫)
P1375 小猫(二飞的小憨猫)连两个点,就把一个多边形,分成了两部分,这两部分的点一定得是偶数,这样就可以递推啦,比如h[5]==h[4][0]+h[3][1]+h[2][2]+h[1][3]+h[ ...
- HTML中元素的定位方式
初中物理就学过,位置是相对的,要有参照物,因此,所有定位都是相对参照物的定位. position 属性: 规定元素的定位类型,该属性的可选值有static.relative.absolute.fixe ...
- 谈 JavaScript 中的强制类型转换 (2. 应用篇)
这一部分内容是承接上一篇的, 建议先阅读谈 JavaScript 中的强制类型转换 (1. 基础篇) 前两章讨论了基本数据类型和基本包装类型的关系, 以及两个在类型转换中十分重要的方法: valueO ...
- ubantu18.04下Hadoop安装与伪分布式配置
1 下载 下载地址:http://mirror.bit.edu.cn/apache/hadoop/common/stable2/ 2 解压 将文件解压到 /usr/local/hadoop cd ~ ...
- [代码审计]covercms 后台getshell
0x00 环境介绍 CMS名称: covercms 运行环境: php 5.6.27-nts + apache + mysql 系统版本: 1.16 漏洞等级:高危 漏洞简介: 后台awnotas.i ...
- 6、Redis中对Hash类型的操作命令
写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- ------------ ...
- Codeforces Round #371 (Div. 2) A. Meeting of Old Friends 水题
A. Meeting of Old Friends 题目连接: http://codeforces.com/contest/714/problem/A Description Today an out ...
- Gym 100646 You’ll be Working on the Railroad dfs
You'll be Working on the Railroad 题目连接: http://codeforces.com/gym/100646/attachments Description Con ...
- CentOS 7解压安装PHP5.6.13
自动化脚本: https://github.com/easonjim/centos-shell/blob/master/php/install-php_5.6.13.sh