原文地址:http://blog.csdn.net/liunian17/article/details/7435781
這裏只說明常用的vector初始化的方式。一般vector的初始化我還是比較習慣於像數組一樣的初始化方式。一個一個賦值,或者用花括號的初始化。下面用一個程序來說明:
- #include "stdafx.h"
- #include <vector>
- #include <iostream.h>
- using namespace std;
- int main(int argc, char* argv[])
- {
- int a[7]={1,2,3,4,5,6,7};
- vector<int> ivector(a,a+7);//vector的賦值並不可以像數組一樣方便的用花括號方便的完成賦值,這裏借用了數組來初始化這個vector,初始化方
- //式vector<elementType> intvec(begin,end);這樣可以用起來看上去還是比較習慣的。
- vector<int>::iterator iter;
- for (iter=ivector.begin();iter!=ivector.end();iter++)
- {
- cout<<*iter<<'\0';
- }
- cout<<endl;
- ivector[5]=1;//單個vector的賦值,這個方式看上去還是和數組一樣的,不過你也可以這麼寫ivector.at(5)=1;但是就是不習慣
- cout<<ivector[5]<<endl<<ivector.size()<<endl;
- for (iter=ivector.begin();iter!=ivector.end();iter++)
- {
- cout<<*iter<<'\0';
- }
- return 0;
- }
vector的遍歷:
一般數組的遍歷方式應該都知道怎麼遍歷。上面用了迭代器進行遍歷,一般在STL中很常見,但是在vector中一樣可以像在數組中用for循環進行遍歷,由於在像鏈表,隊列,棧這樣的容器中沒有辦法用像遍歷數組一樣遍歷,只能用迭代器,所以對於STL中通用用迭代器進行遍歷。
但是還有一種簡便的方式。
- #include "stdafx.h"
- #include <vector>
- #include <algorithm>
- #include <iostream>
- using namespace std;
- void print(int n)
- {
- cout<<n<<'\0';
- }
- int main(int argc, char* argv[])
- {
- int a[7]={1,2,3,4,5,6,7};
- vector<int> ivector(a,a+7);
- vector<int>::iterator iter;
- for_each(ivector.begin(),ivector.end(),print);//用for_each進行遍歷
- cout<<endl;
- ivector[5]=1;
- cout<<ivector[5]<<endl<<ivector.size()<<endl;
- for_each(ivector.begin(),ivector.end(),print);//用for_each進行遍歷
- return 0;
- }
這種方式的遍歷引用另一篇文章:
對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:加強代碼自說明能力,減少循環,提高代碼可讀性