【经验】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),其中封装了很多容器,不需要费力去实现它们的细节而直接调用函数来实现功能. 具体容器链 ...
随机推荐
- Django 2.1版本与Django 1.8.3的一些区别(转)
Django 2.1版本与Django 1.8.3的一些区别 我在刚开始学习的时候使用的Django版本是1.8.3的,后来在安装其它软件的时候,可能需要2.1的版本,自动帮我更新了Djang ...
- 社会地位即服务, Status as a Service (一): 社交网络是一种 ICO 行为?
上周,看到 Eugene Wei 又发了一篇长文,Status as a Service (StaaS).状态即服务?服务器的状态吗?不知所言.抱着好奇,我打开了这篇文章,一看就是 3 个小时!
- 循序渐进学.Net Core Web Api开发系列【10】:使用日志
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.本篇概述 本篇介 ...
- 如何处理C++构造函数中的错误——兼谈不同语言的错误处理
用C++写代码的时候总是避免不了处理错误,一般来说有两种方式,通过函数的返回值或者抛出异常.C语言的错误处理一律是通过函数的返回值来判断的,一般是返回0.NULL或者-1表示错误,或者直接返回错误代码 ...
- BZOJ2944 : [Poi2000]代码
对于根,要让它的排名尽量小,也就是要让右子树的点数尽量多. 于是从大到小枚举右子树的点数,用Catalan数计算方案数,直到找到相应的右子树的点数为止. 此时根的排名已经确定,接下来要让左子树的代码的 ...
- iOS键盘类型最全
一.键盘风格 UIKit框架支持8种风格键盘. typedef enum { UIKeyboardTypeDefault, // 默认键盘:支持所有字符 UIKeyboa ...
- Docker系列之(一):10分钟玩转Docker
1.前言 进入云计算的时代,各大云提供商AWS,阿里云纷纷推出针对Docker的服务,现在Docker是十分火爆,那么Docker到底是什麽,让我们来体验一下. 2.Docker是什麽 Docker是 ...
- CentOS 7下使用chkconfig添加的服务无法使用/etc/profile里面的环境变量
经过分析/etc/profile为入口的,基本是登录后执行的变量,而使用chkconfig添加的服务多变以守护经常运行,没有登录. CentOS 7下使用chkconfig添加的服务无法使用/etc/ ...
- LPC-LINK 2 Board IO
- stap 命令
SystemTap accepts script as command line option or external file, for example: * Command-line script ...