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

简单的容器有关问题(C++)

2012-11-09 
简单的容器问题(C++)假设有如下ia的定义,将ia复制到一个vector容器和一个list容器中。使用单个迭代器参数版

简单的容器问题(C++)
假设有如下ia的定义,将ia复制到一个vector容器和一个list容器中。使用单个迭代器参数版本的erase函数将list容器中的奇数值元素删除掉,然后将vector容器中的偶数值元素删除掉。
我的代码如下:
#include <iostream>
#include <vector>
#include <list>
using namespace std;
int main()
{
int ia[]={1,2,3,4,5,6,7,8,9,0};
vector<int> a;
list<int> b;
for(size_t i=0;i!=ia.size();i++)//我若这么写:for(int i=0;i!=10;i++)虽然能编译通过,但不是让人很容易理解?
a.push_back(ia[i]);
for(i=0;i!=ia.size();i++)//
b.push_back(ia[i]);
for(vector<int>::iterator iter1=a.begin();iter1!= a.end();iter1++)
if((*iter1)%2==0)
  a.erase(iter1);
for(list<int>::iterator iter2=b.begin();iter2!= b.end();iter2++)
if((*iter2)%2!=0)
  b.erase(iter2);
for(iter1=a.begin();iter1!= a.end();iter1++)
cout << (*iter1) << " ";
for (iter2=b.begin();iter2!= b.end();iter2++)
cout << (*iter2) << " ";

   

return 0;;
}
当我把代码中的ia.size()改为10的时候,程序会崩溃~ 我估计数组复制那边可能有问题,麻烦前辈帮忙看下,小弟不胜感激~~

[解决办法]

探讨

第一,ia是个数组,哪来的size()?
第二,用的VC6.0吧?否则按照标准,for循环里定义的size_t出了for循环就失效,第二个for循环语句通不过编译
第三,在一个容器里删除某个迭代器指向的元素时,要先去查清楚在这个容器类型里删掉这个元素后这个迭代器还是否有效

最重要的是,别“估计”了,单步调试吧

[解决办法]

for(vector<int>::iterator iter1=a.begin();iter1!= a.end();iter1++)
 if((*iter1)%2==0)
a.erase(iter1);


这个地方有问题,对于vector的删除操作不能在for循环中这样做,即便要在for循环中做也不能这样写,因为erase执行完后,iter1没有变,而iter1已经从vector中删除,那么执行iter1++时这个iter1指向哪里去了呢?
list也是一样
正确的做法:

int vsize=a.size();
for(int i = 0; i < vsize;)
{
if(a[i]%2 == 0)
a.erase(a.begin() + i);
else
++ i;
}

热点排行