使用vector前,請先  #include <vector>。以下文章若無特別說明,則均假設如下:

vector<int> v, v1, v2;
int array[] = {0,1,2,3,4};

 

0. vector 快速使用

vector<int> v1;
vector<double> v2;

// 清除內容, 重新設大小
v1.clear(), v2.clear();
v1.resize(5);
v2.resize(10);

// 新增元素
int i;
for(i=0; i<v1.size(); i++) v1.push_back(i);
for(i=0; i<v2.size(); i++) v2[i] = double(i);

 

1. 大小控制

(1.1) 檢查是否為空:v.empty();
(1.2) 直接將v清空:v.clear();
(1.3) 檢查目前大小:v.size();
(1.4) 檢查最大容量:v.maxsize();
(1.5) 檢查目前容量:v.captacity();
(1.6) 清除所有內容:v.clear();
(1.7) 清除指定元素:v.erase(v.begin());  v.erase(v.end()-1);
(1.8) 讀取並刪除最後一元素:v.pop_back(v.size()-1);
(1.9) 重新設定大小:v.resize(5);

關於 v.resize() 要說明一下,若開始是使用 vector<int> v(3,5),將v設成3個元素,每個元素都設5,之後調用 v.resize(2) 之後,邊界大小被調成2 ,若再調用 v.resize(6),則 v[0], v[1] 為 5,v[2]~v[5] 為 0。

(1.10) 自動掌控大小:v.reserve(6)

和 v.resize() 有所不同,v.resize() 是將 vector 重新調整大小。若開始是用 vector<int> v(3, 5),使用 v.reserve(6),實際上 vector v 之大小仍為3,同時調用 v.at(3) 仍將失敗。詳情請查閱 MSDN。

 

2. 建構子(Construction)

#define CNT 5
int array[] = {0,1,2,3,4};
int *arr2 = new int[CNT];
for(int i=0; i<CNT; i++) arr2[i] = i;

(2.1) 建立空之 vector:vector <int> f1; // 建立空之 vector
(2.2) 建立4個元素為100之v:vector <int> f2(4, 100);
(2.3) 用iterator直接從f2複製元素:vector <int> f3(f2.begin(), f2.end());
(2.4) 從 array(stack) 複制:vector <int> f4(array, array + sizeof(array)/sizeof(int));
(2.5) 從 array(heap) 複製:vector <int> f5(arr2, arr2+CNT);

注意,若 vector 初始化為 empty,在建立任何元素之前,不可調用足標運算子。如:

 vector<int> v;
 v[0] = 1;
 v[1] = 2;
 

 

3. 尋訪(travel)

 (3.1) ,(3.2) 假設如下:

int i;
int array[] = {0,1,2,3,4};
vector<int> v(array, array+sizeof(array)/sizeof(array[0]);

(3.1) 使用足標運算子 / function member - at

// 尋訪, 0,1,2,3,4
for(int i=0; i<v.size(); i++) cout << v[i] << " ";
for(int i=0; i<v.size(); i++) cout << v.at(i) << " ";

(3.2) 使用 iterator

vector<int>::iterator it_i;
// 尋訪
for(it_i=ff.begin(); it_i!=ff.end(); ++it_i) cout << *it_i << " "; 

 

4. 將其它 vector 或 array 設給 (assign) 另一 vector

int array[] = {0,1,2,3,4};
vector<int> v(10,0); // {0,0,0,0,0,0,0,0,0,0}
vector<int> v1;
v1.assign(10, 0); // v1 設 10 個 0
v1.assign(v.begin(), v.end()); // v1 複制 v
v1.assign(v.begin(), v.begin()+5); // 複製 v 前5個元素到 v1
v1.assign(array, array+5); // 複製 array 前5個元素到 v1

 

5. 新增/移除元素

(5.1) 從尾端新增:for(i=0; i<10; i++) v.push_back(i);
(5.2) 從尾端移除:while(!v.empty()) v.pop_back();

 

6. 當二維陣列使用

unsigned i,j;
vector<vector<int> > x; // x[M][N]
x.resize(M);
for(i=0; i!=M; ++i) x[i].resize(N);

for(i=0; i!=M; ++i)
    for(j=0; j!=N; ++j)
        x[i][j] = i*N+j;

 

 

本文講的都是最基本、效率較差的方式。關於 vector 記憶體控制、當二維陣列使用較佳之方式,本文均沒提出來,有興趣可看筆者另一篇文章及回復之討論。

[STL Note] vector 注意事項 & FAQ

edisonx 發表在 痞客邦 留言(8) 人氣()