vector用法注意

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.