#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;
}