首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++Primer第三版习题6.12,该如何解决

2012-02-04 
C++Primer第三版习题6.12题目:请写一个程序,接受下列的定义:intia[]{0,4,1,2,3,5,8,13,21,55,89}listin

C++Primer第三版习题6.12
题目:
      请写一个程序,接受下列的定义:
int   ia[]   =   {0,   4,   1,   2,   3,   5,   8,   13,   21,   55,   89};
list   <int>   ilist(ia,   ia+11);
用单个iterator形式的erase()删除ilist中所有奇数位置的元素。

疑问:list在内存中不是连续的,它的iterator指针不能做算术运算,那请问这个该怎么来实现。。如果要是vector的就好办了。。下面写的是vector   的实现:
#include   <iostream>
#include   <vector>
using   namespace   std;

void   main()
{
int   ia[]   =   {0,   4,   1};

vector   <int>   ivec(ia,   ia+3);
vector   <int> ::iterator   iter;


for   (iter   =   ivec.begin()+1;   iter   !=   ivec.end();   iter++)
{
//cout   < <   *iter   < <   endl;
ivec.erase(iter);
//cout   < <   *iter   < <   endl;
}

for   (iter   =   ivec.begin();   iter   !=   ivec.end();   iter++)
cout   < <   *iter   < <   '   ';

cout   < <   endl;
}

ps:本来一开始写成的是for   (iter   =   ivec.begin()+1;   iter   !=   ivec.end();   iter   +=   2),运行发现不对。调试过程中发现erase()后iterator指针会自动向后移一个。。

然后我又试下删除偶数位的元素,就把上面的程序稍微改了下:
for   (iter   =   ivec.begin()+1;   iter   !=   ivec.end();   iter++)
            ivec.erase(iter);
运行后出现异常,那注释部分就是舔加的打印调试,单步调试输出为   0   4   1   1   1   异常
既然erase()后指针向下移动一个,那也应该是   0   4   1然后达到了ivec.end()了,怎么会这样呢??/

哪个帮忙给说说,先谢了。。。。


[解决办法]
看 <Effective STL> item 9

热点排行