#include<iostream>
#include<vector>
using namespace std;
int main()
{
int Array[5]={1,2,3,4,5};
vector<int> ivec(Array,Array+5);
vector<int>::iterator iter=ivec.begin();
for(iter;iter!=ivec.end();++iter);
{
if(*iter!=0)
{
cout<<*iter;
ivec.push_back(*iter);
}
if(ivec.size()==10)
return 0;
}
return 0;
}
上面这段程序出现异常
程序中有一段和该程序差不多,
要求不符合条件的在vector 的后面添加该元素,直到符合条件退出,但是在第一次插入后下次循环就出现异常。
为什么?如何修改呢?
答:
不断的压入新元素会引起容器重新申请内存并转移数据,迭代器已经指向了新内存地址,*iter访问了别的进程的内存空间,当然要出错了。
出错的原因在于vector是动态管理内存的,当其容量不够时会重新分配新的数据区,同时将原来的数据拷贝到这块区域里(以保证地址连续),所以push_back之后,iter指向的值就不再有效了(如果超过了容量的话),这时再使用它就有错
可以采用下标的方式
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int Array[5]={1,2,0,4,5};
vector<int> ivec(Array,Array+5);
for(int i=0; i<ivec.size(); i++)
{
cout << ivec[i];
if(ivec[i]!=0)
{
ivec.push_back(ivec[i]);
}
if(ivec.size()==10) //结束条件必不可少
return 0;
}
return 0;
}
本文解决了一个C++程序中关于Vector容器迭代器失效的问题,并提供了一种替代方案来避免内存重新分配导致的迭代器失效。

838

被折叠的 条评论
为什么被折叠?



