C++Primer第四版习题9.26答案调试出错的解决
来源:互联网 发布:深圳太极软件怎么样 编辑:程序博客网 时间:2024/05/19 10:35
习题9.26原答案出错的解决
解决代码如下:
#include <iostream>include <vector>include <list>using namespace std;int main(){ int a[]={0,1,1,2,3,5,8,13,21,55,89}; int cnt=sizeof(a)/sizeof(int); vector<int> ivec_a(a,a+cnt); list<int> ilist_a(a,a+cnt); for(vector<int>::iterator viter=ivec_a.begin();viter!=ivec_a.end();) { //代码的关键部分是这里,原答案认为删除指定元素后,迭代器指向下一个元素, //所以应该减一,以便在原答案的for循环里自动加1,但经过调试发现当删除一个 //元素后,再次调用begin()函数发现容器的开始处已经由原先的0变成了1; //此时若是把返回来的viter减1为0,则出现未定义,所以报错。 if(0==*viter%2) viter=ivec_a.erase(viter); else viter++; } for (list<int>::iterator liter=ilist_a.begin();liter!=ilist_a.end();) { if (0!=*liter%2) liter=ilist_a.erase(liter); else liter++; } cout<<"New vector is:"<<endl; for(vector<int>::iterator viter=ivec_a.begin();viter!=ivec_a.end();viter++) cout<<*viter<<' '; cout<<endl; cout<<"New list is:"<<endl; for (list<int>::iterator liter=ilist_a.begin();liter!=ilist_a.end();liter++) cout<<*liter<<' '; cout<<endl; return 0;}
所以现在的解决方法是删除后迭代器是自动指向被删除元素的下一个元素,那么就不必对迭代器进行任何操作,下次循环正好对被删除元素的下一个元素操作,反而在没有删除时,需要手动更新迭代器的指向,指向容器中的下一个元素。
假设我们把头两个数换成8,9,将代码稍作修改,会发现在将第一个8删除之后,再去调用begin函数,那么产生的新迭代器是指向9的,也就是说删除一个元素之后,容器本身就进行了更新,此时删除8之后viter指向了新容器的begin处,所以不能进行减操作。
int a[]={8,9,1,2,3,5,8,13,21,55,89};int cnt=sizeof(a)/sizeof(int);vector<int> ivec_a(a,a+cnt);list<int> ilist_a(a,a+cnt);for(vector<int>::iterator viter=ivec_a.begin();viter!=ivec_a.end();viter++){ if(0==*viter%2) viter=ivec_a.erase(viter); viter--; vector<int>::iterator newviter=ivec_a.begin(); //此时newviter指向9}
这道题正好在容器的开头处,所以出现报错,但是如果在容器中间的话,删除之后也是不能减的,原因大家应该也清楚了,不过应该不会报错,只是逻辑不对,同一个元素处理了两次。
以上代码测试于VS2005,如有错误,望帮忙指正,谢谢!
1 0
- C++Primer第四版习题9.26答案调试出错的解决
- C++Primer第四版习题16.12答案调试出错的解决
- C++Primer 第四版 习题9.27的答案问题
- c++primer第四版习题6.12答案更正
- C++Primer 中文版 第五版 第四章课后习题答案
- c++primer 习题答案
- C++Primer第五版 第四章习题答案(1~10)
- C++Primer第五版 第四章习题答案(11~20)
- C++Primer第五版 第四章习题答案(21~30)
- C++Primer第五版 第四章习题答案(31~38)
- C++primer第5版课后练习习题答案9.26
- C++Primer(第五版) 习题答案
- C++Primer 第五版 (课本习题答案)
- C++primer 第四版部分习题的解答
- c++primer(第四版)习题10.18
- 《c++primer(第四版)》习题8.6
- 《c++primer(第四版)》习题8.7
- 《c++primer(第四版)》习题8.9
- winXP/7/8/8.1/10专业版/旗舰版无人值守文件
- 二叉树的非递归遍历
- 存储专栏:EMC Symmetrix SRDF很老很强大
- 明星软件工程师的10种特质
- ViewPager 详解(二)---详解四大函数
- C++Primer第四版习题9.26答案调试出错的解决
- wp_signon()
- activiti中监听器的配置和使用详解
- win linux命令行下写webshell语句
- android的logcat的message有字符长度的限制,超过将直接截断
- [转]Android Binder设计与实现
- android studio 混淆
- ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同
- Egret起步