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

c++来!

2012-03-12 
c++高手进来!!有一段程序不知道错在哪里,请高手过目!#include iostream#include list#include string

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指向的位置就失效了。

热点排行