標籤:c++ 迭代器
當vector或者是string容器被重新分配的時候,則原來指向容器元素的指標、引用或者是迭代器失效。
但是如果儲存空間未重新分配,即當容器vec中有vec.capacity()>vec.size()時候,指向插入位置之前的元素的迭代器、指標和引用仍然有用,但是指向插入位置之後的任何位置的迭代器、指標和引用都會失效。
下面將用程式分析:
#include<vector>#include<iostream>using namespace std;int main(){vector<int> sb(3);cout<<"capacity="<<sb.capacity()<<endl<<endl;sb.reserve(5);int ssd=0;for(vector<int>::iterator it=sb.begin();it!=sb.end();++it) *it=ssd++;vector<int>::iterator iter=sb.begin(),mid=sb.begin()+sb.size()/2;cout<<"capacity="<<sb.capacity()<<endl<<endl;int k=11;while(iter!=mid){if(*iter!=-7)//iter=sb.begin();//sb.insert(iter,16); sb.insert(iter,k);for(vector<int>::iterator it=sb.begin();it!=sb.end();++it) cout<<*it<<"\t"; cout<<endl; k++;//cout<<"\nmid="<<*mid<<"\titer="<<*iter<<endl;}return 0;} 程式運行結果:
程式在編譯的時候是沒有錯誤的,但是在運行一段之後就開始報錯。
首先對原來capacity為3的vector,用
reserve();
函數將其capacity改為5.。
然後再vector頭插入元素,當capacity()小於5時候都不會報錯,這個很容易理解。
而是在我們插入第七個元素的時候報錯,是因為我們在capacity為5時候其迭代器iter還是可用的,所以插入第六個元素還是正確。之後由於元素值大於了capacity所以要重新分配,使得迭代器失效。程式報錯。
下面我們看看後面的插入元素的之後的迭代器是怎麼失效的
#include<vector>#include<iostream>using namespace std;int main(){vector<int> sb(3);cout<<"capacity="<<sb.capacity()<<endl<<endl;sb.reserve(5);int ssd=0;for(vector<int>::iterator it=sb.begin();it!=sb.end();++it) *it=ssd++;vector<int>::iterator iter=sb.begin(),mid=sb.begin()+sb.size()/2,iter_end=sb.end()-1; cout<<"capacity="<<sb.capacity()<<endl<<endl;for(vector<int>::iterator it=sb.begin();it!=sb.end();++it) cout<<*it<<"\t"; cout<<"\nend="<<*iter_end<<endl;int k=11;while(iter!=mid){if(*iter!=-7)//iter=sb.begin();//sb.insert(iter,16); sb.insert(iter,k);for(vector<int>::iterator it=sb.begin();it!=sb.end();++it) cout<<*it<<"\t"; cout<<endl; k++; cout<<"end="<<*iter_end<<endl; //cout<<"\nmid="<<*mid<<"\titer="<<*iter<<endl;}return 0;}
修改程式之後我們加入語句
cout<<"end="<<*iter_end<<endl;
用來輸出最後一個元素。
程式運行結果
我們可以看到原來的最後一個元素應該是2.
在沒有插入元素時候是正確的。
但在插入元素之後iter_end指的位置還是離初始位置三個元素的距離而不是最後的元素。
當最後一次重新分配的記憶體之後,原來迭代器所指的位置被釋放了之後,得到的數值就是一個亂碼值。
c++關於順序容器指標迭代器失效問題