【经验】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),其中封装了很多容器,不需要费力去实现它们的细节而直接调用函数来实现功能. 具体容器链 ...
随机推荐
- 蓝牙设备探测工具blueranger
蓝牙设备探测工具blueranger blueranger是Kali Linux预安装的一款蓝牙探测工具.该工具通过向指定设备发送蓝牙L2CAP协议的ping包,创建连接.由于大部分蓝牙设备对pi ...
- Python基础笔记(二)
1. List和Tuple List和Tuple是Python的内置的数据类型,区别在于可变和不可变,List用[]表示,Tuple用()表示,它们之间可以相互转换: # List to Tuple ...
- django-模板初探
一般而言,我们在视图函数中处理各种业务逻辑之后,应该返回一个 HttpResponse 对象.而 HttpResponse 对象的第一个参数接受字符串或者是迭代器,作为响应报文的主体.但是这意味着我们 ...
- 牛客OI赛制测试赛3游记
A - 数字权重 题目大意: 一个\(n\)位的数字.设第\(i\)位的数为\(a_i\),其中\(a_1\)为最高位,\(a_n\)为最低位,\(k\)为给定的数字.求同时满足满足以下两个条件的数的 ...
- HDU5420 : Victor and Proposition
以深度建立线段树,线段树父亲节点向儿子节点连边,然后用线段树合并可以得到任何一个点子树的线段树,只需向对应节点的线段树中的$O(\log n)$个点连边即可.为了保证连边关系不发生混乱,线段树需要进行 ...
- 【BZOJ-1493】项链工厂 Splay
1493: [NOI2007]项链工厂 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 1440 Solved: 626[Submit][Status] ...
- 13、Redis的发布订阅模式
写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------------------- ...
- Codeforces Round #375 (Div. 2) D. Lakes in Berland 贪心
D. Lakes in Berland 题目连接: http://codeforces.com/contest/723/problem/D Description The map of Berland ...
- LOG EXPLORER ApexSQL Log
http://www.minisoft.cn/ https://www.apexsql.com/sql_tools_log.aspx
- 再议ASP.NET MVC中CheckBoxList的验证
在ASP.NET MVC 4中谈到CheckBoxList,经常是与CheckBoxList的显示以及验证有关.我在"MVC扩展生成CheckBoxList并水平排列"中通过扩展H ...