简单的容器问题(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的时候,程序会崩溃~ 我估计数组复制那边可能有问题,麻烦前辈帮忙看下,小弟不胜感激~~
[解决办法]
[解决办法]
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;
}