c++高手进来!!
有一段程序不知道错在哪里,请高手过目!
#include <iostream>
#include <list>
#include <string>
using namespace std;
int main()
{
int ia[]={0,1,2,3,5,8,13,21,55,89};
list <int> ilist;
for(int i=0;i <10;i++)
{
ilist.push_back(ia[i]);
}
list <int> ::iterator it2 = ilist.begin();
for(;it2!=ilist.end();)
{
if((*it2)%2==0)
ilist.erase(it2);
else ++it2;
}
cout < < "the two is: " < <endl;
it2 = ilist.begin();
for(;it2!=ilist.end();++it2)
out < <*it2 < <endl;
return 0;
}
原题是c++Primer 第四版 282页的9.26
[解决办法]
这是list和vector的区别。
首先肯定的是,在依据一个iterator做erase后,这个iterator仍然指向它原来的那块内存。
在list中,erase后,节点被删除了,所以it2指向的是被删除的节点内存,当然是不对的;
在vector中,请注意它是连续的内存,erase是将该位置后面的元素前移一个位置,所以it1虽然指向的内存不变,但它的值已经是下一个值了。
当然,这种方法遍历vector的方法依赖于erase的实现,因此是非普适的。例如,如果vector发现它的元素个数小于一个量时,它可能会释放现有的较大内存,换一块较小的内存。这样it1指向的位置就失效了。