vector的初始化和遍歷

原文地址:http://blog.csdn.net/liunian17/article/details/7435781

這裏只說明常用的vector初始化的方式。一般vector的初始化我還是比較習慣於像數組一樣的初始化方式。一個一個賦值,或者用花括號的初始化。下面用一個程序來說明:

  1. #include "stdafx.h"  
  2. #include <vector>  
  3. #include <iostream.h>  
  4. using namespace std;  
  5.   
  6. int main(int argc, char* argv[])  
  7. {  
  8.     int a[7]={1,2,3,4,5,6,7};  
  9.     vector<int> ivector(a,a+7);//vector的賦值並不可以像數組一樣方便的用花括號方便的完成賦值,這裏借用了數組來初始化這個vector,初始化方  
  10.     //式vector<elementType> intvec(begin,end);這樣可以用起來看上去還是比較習慣的。  
  11.     vector<int>::iterator iter;  
  12.     for (iter=ivector.begin();iter!=ivector.end();iter++)  
  13.     {  
  14.         cout<<*iter<<'\0';  
  15.     }  
  16.     cout<<endl;  
  17.     ivector[5]=1;//單個vector的賦值,這個方式看上去還是和數組一樣的,不過你也可以這麼寫ivector.at(5)=1;但是就是不習慣  
  18.     cout<<ivector[5]<<endl<<ivector.size()<<endl;  
  19.     for (iter=ivector.begin();iter!=ivector.end();iter++)  
  20.     {  
  21.         cout<<*iter<<'\0';  
  22.     }  
  23.     return 0;  
  24. }  


vector的遍歷:

一般數組的遍歷方式應該都知道怎麼遍歷。上面用了迭代器進行遍歷,一般在STL中很常見,但是在vector中一樣可以像在數組中用for循環進行遍歷,由於在像鏈表,隊列,棧這樣的容器中沒有辦法用像遍歷數組一樣遍歷,只能用迭代器,所以對於STL中通用用迭代器進行遍歷。

但是還有一種簡便的方式。

  1. #include "stdafx.h"  
  2. #include <vector>  
  3. #include <algorithm>  
  4. #include <iostream>  
  5. using namespace std;  
  6. void print(int n)  
  7. {  
  8.     cout<<n<<'\0';  
  9. }  
  10. int main(int argc, char* argv[])  
  11. {  
  12.     int a[7]={1,2,3,4,5,6,7};  
  13.     vector<int> ivector(a,a+7);  
  14.     vector<int>::iterator iter;  
  15.     for_each(ivector.begin(),ivector.end(),print);//用for_each進行遍歷    
  16.     cout<<endl;  
  17.     ivector[5]=1;  
  18.     cout<<ivector[5]<<endl<<ivector.size()<<endl;  
  19.     for_each(ivector.begin(),ivector.end(),print);//用for_each進行遍歷    
  20.     return 0;  
  21. }  


 

這種方式的遍歷引用另一篇文章:

對STL的容器中,遍歷是一個非常經常採用的動作,爲此STL也提供一個算法,for_each
遍歷一個容器,我們第一個想到的是
for (int i = 0;i < a.size();++i)
的循環來實現。
這樣做有幾個弊端,比如我現在很多地方用vector作爲傳引用參數進行傳遞,爲了減少對象構造和析構的代價,我一般採用指針來傳遞,那麼我就要在程序很多地方 寫上類似下面的代碼
for (int i=0;i < a.size();++i)
     delete a[i];
雖然代碼很多都一樣,可是到處氾濫着這種循環語句,讓人閱讀程序容易和其它釋放指針行爲產生混淆
好處有幾個:
1:for_each調用容器內部的遍歷函數,比我們的++的方式遍歷,效率不會低是肯定的
2:delete指針時候,可以再次確認指針類型
3:用仿函數類,編譯器在編譯期對函數進行展開,實際上沒有函數調用的發生
4:加強代碼自說明能力,減少循環,提高代碼可讀性

文章來自


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章