STL程序设计实践二: 注意迭代子的失效

原创 2001年11月10日 18:38:00

 

 

STL程序设计实践二: 注意迭代子的失效<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

迭代子是STL中很重要的特性,但是其很脆弱(我个人认为),因为使用它的条件很苛刻,一不小心就失效了。其在两中情况下可能会失效。

1.当容器有插入操作时

在初始化了迭代子后,如果容器有插入操作时,迭代子可能失效。

#include <iostream>

#include <vector>

 

using namespace std;

 

void main()

{

vector<int> vecobj(10,5);

vector<int>::iterator iter=vecobj.begin();

vecobj.insert(iter,6);

for(;iter!=vecobj.end();iter++)

{

cout<<*iter<<endl;

}

}

当编译并执行该程序时,输出的结果乱七八糟。这是因为在初化了迭代子后,容器发生了插入操作而引起的。所以容器在发生了插入操作后迭代子需重新初始化。把上面的for语句换成下面的即可输出正常,当然实际的应用中不可能如此简单,但一定要小心使用。

for(iter=vecobj.begin();iter!=vecobj.end();iter++)

2.当容器有删除元素操作时

在初始化了迭代子后,如果容器有删除元素操作时,迭代子可能失效。

#pragma warning(disable : 4786)

#include <iostream>

#include <vector>

using namespace std;

 

int main (void)

{

vector<int> nvec(10,7);

vector<int>::iterator it=nvec.begin();

for(;it!=nvec.end();it++)

{

if(*it==7) nvec.erase(it);

}

for(it=nvec.begin();it!=nvec.end();it++)

{

cout<<*it<<endl;

}

return 0;

}

我们的意图很明显是想删除所有容器中值为7的对象。但结果并没删除完(不要告诉我请用clear)。

当我们利用迭代子删除和插入元素时都有可能使迭代子失效。迭代子的失效可能引起许多的问题,所以我们要注意。一定要小心的使用迭代子,一定要小心。在这个世界生存,什么都要小心,不是吗?:)

文章写的仓促,有错别字或错误请大家多批评指出。谢谢大家的捧场,在下感激不尽,欢迎和大家交流 (-袁凯-)。

 

 

关于STL中map的erase迭代器是否失效的讨论

近来,在阅读一份开源代码的时候,看到了类似如下的代码:typedef std::map id_names_t; id_names_t id_names; void EraseName(std::st...
  • haust_wang
  • haust_wang
  • 2015年10月21日 10:16
  • 2067

C++ STL 迭代器失效问题

之前看《C++ Primier》的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究。今天写程序的时候遇到了这个问题。 1 莫名其妙的Erase     最初我...
  • coderCong
  • coderCong
  • 2016年07月29日 15:03
  • 2470

【C++】:STL迭代器使用详解,很好很详细

写在前面,迭代器这种东西,就是为了使访问简单!! 容器::iterator iter; for(iter= 容器.begin();iter!=容易.end();iter++){ coutfirst等等...
  • qq_23100787
  • qq_23100787
  • 2016年05月12日 22:28
  • 7146

C++程序设计实践:银行前台服务系统(二)

源代码 mainBody.cpp #include #include #include #include #include #include #include #i...
  • cxx0739
  • cxx0739
  • 2012年05月31日 15:53
  • 353

编译原理程序设计实践(六) 语句和子过程的处理代码

/* 语句处理过程statement */ /* 参数说明:fsys: 如果出错可用来恢复语法分析的符号集合 */ void statement(const symset& fsys,const ...
  • laomai
  • laomai
  • 2013年03月13日 21:52
  • 1264

输入输出迭代子的用法

输入输出迭代子 可以将标准输入对象cin组装成输入流迭代子(istream_iterator),也可以将标准输出对象组装成输出流迭代子(ostream_iterator), 以此来完成输入输出...
  • chijianxingfeng
  • chijianxingfeng
  • 2013年05月02日 23:08
  • 667

编译原理程序设计实践(二) 全局变量定义

以下各节的代码根据教材P288的附录A中的pascal代码改写而来。改写时的要求是 1、尽量使用原有的变量名和类型名、函数名和参数名 2、对c++中未提供的运算符或者函数,则额外实现 3、尽量不...
  • laomai
  • laomai
  • 2013年03月13日 21:25
  • 1504

PKU C++程序设计实习 学习笔记6 标准模板库STL

标准模板库STL 8.1 STL概述 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用:1.面向对象的思想:继承和多态,标准类库  2.泛型程序设计(gene...
  • buxizhizhou530
  • buxizhizhou530
  • 2015年05月10日 12:02
  • 1222

标准模板库 STL-2 编程题#5: 热血格斗场(Coursera 程序设计与算法 专项课程3;函数用法:lower_bound, equal_range)

编程题#5: 热血格斗场来源: POJ (http://cxsjsx.openjudge.cn/hw2017total01/H05/)注意: 总时间限制: 1000ms 内存限制: 65536kB描述...
  • happyygdx
  • happyygdx
  • 2017年11月27日 22:18
  • 225

2017 程序设计实习之C++部分作业题汇总 - H:STL 容器与算法

题目来源:2017 程序设计实习之C++部分作业题汇总 1、H01:List 总时间限制: 4000ms 内存限制: 65536kB 描述 写一个程序完成以下命令: new id ——新建一...
  • Veniversum
  • Veniversum
  • 2017年05月10日 12:19
  • 260
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL程序设计实践二: 注意迭代子的失效
举报原因:
原因补充:

(最多只允许输入30个字)