c++關於順序容器指標迭代器失效問題

來源:互聯網
上載者:User

標籤: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++關於順序容器指標迭代器失效問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.