读书人

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

发布时间: 2012-02-04 15:43:08 作者: rapoo

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

读书人网 >C++

热点推荐