CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

C++ primer中关于容器的问题

楼主mochen5460(mochen)2006-12-03 22:06:46 在 C/C++ / C++ 语言 提问

int   main()  
  {    
  string   sa[4]={"quasi",   "simba",   "frollo",   "scar"};  
  deque<string>   slist(sa,sa+4);  
  string   searchValue("simba");  
  for(deque<string>::iterator   si=slist.begin();si!=slist.end();++si)  
  cout<<*si<<endl;  
  deque<string>::iterator   siter=find(slist.begin(),slist.end(),searchValue);  
  if(siter!=slist.end())  
  {  
  slist.erase(siter);  
  cout<<*siter<<endl;  
  }  
   
  return   0;  
  }  
   
  代码如上,为什么我分别用vector,list,deque三种容器,输出都不一样呢?按书上说的应该都是输出frollo才对呀,我在VC2005中,输出分别是frollo,   ,quasi(注:第二个为空白),   哪位高人指点一下啊,谢谢了。  
  另在VC6中的结果与在VC2005中又不一样!! 问题点数:10、回复次数:9Top

1 楼tghost333(换了工具,总是新手)回复于 2006-12-03 22:16:40 得分 0

dingTop

2 楼zlbruce()回复于 2006-12-03 22:31:02 得分 0

erase   之后,迭代器就已经失效了Top

3 楼Albertjj(Albert)回复于 2006-12-03 22:37:18 得分 0

slist.erase(siter);  
  cout<<*siter<<endl;  
   
  这两句换一下Top

4 楼owlling(owlman)回复于 2006-12-03 22:43:03 得分 0

看看关于迭代器失效的问题吧,很多操作会导致迭代器失效的,。一旦迭代器失效了,他的行为就无法预测了,不要说不同容器,就是相同容器相同的编译器编译出来的程序两次运行的结果都有可能不相同的。  
   
  ==================================  
  欢迎访问我的个人主页:http://www.lingjie.net/  
  ==================================Top

5 楼dushman(肥珍)回复于 2006-12-04 01:30:15 得分 0

在C++   primer   后面几页有说明,当插入,和删除时候迭代器会实效,所以要特别注意失效的问题Top

6 楼dushman(肥珍)回复于 2006-12-04 01:34:16 得分 0

这里也有讨论迭代器失效的问题  
  http://bbs.chinaunix.net/archiver/?tid-779150.htmlTop

7 楼mochen5460(mochen)回复于 2006-12-04 19:03:48 得分 0

C++   primer的书上是这么说的:c.erase(p)   删除迭代器p所指向的元素,返回一个迭代器,它指向被删除元素后面的元素。如果p指向容器内的最后一个元素,则返回的迭代器指向容器的超出末端的下一位置。如果p本身就是指向超出末端的下一位置的迭代器,则该函数示定义。  
          按照这种说法,应该都是输出frollo呀Top

8 楼A_B_C_ABC(黄瓜@YouCanDoIt)回复于 2006-12-04 20:10:18 得分 10

C++   primer的书上是这么说的:c.erase(p)   删除迭代器p所指向的元素,返回一个迭代器,它指向被删除元素后面的元素。如果p指向容器内的最后一个元素,则返回的迭代器指向容器的超出末端的下一位置。如果p本身就是指向超出末端的下一位置的迭代器,则该函数示定义。  
          按照这种说法,应该都是输出frollo呀  
  =========================================  
   
  if(siter!=slist.end())  
  {  
  siter=slist.erase(siter);//你要这里保存返回的迭代器,才会是输出frollo呀,否则siter就失效了啊  
  cout<<*siter<<endl;  
  }Top

9 楼mochen5460(mochen)回复于 2006-12-05 10:33:58 得分 0

谢谢ABC,一针见血。我是初学者,以后多指教啊Top

相关问题

关键词

得分解答快速导航

  • 帖主:mochen5460
  • A_B_C_ABC

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo