使用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 發表在 痞客邦 PIXNET 留言(8) 人氣()


留言列表 (8)

發表留言
  • q
  • good!
  • novus
  • 這篇被翻上來,剛好讓我想到還可以再補充一個重要的概念:iterator stability。這是很多初學者容易犯錯的地方。

    有一些容器提供 stable iterator 保證,很不幸的 vector 不保證。或許你可以再多花一節的篇幅列舉可能造成vector iterator 失效的操作。

    (雖然這是一個STL使用者須知的基本的常識,不過似乎這個名稱也不是普遍被使用,所以你知道這回事卻沒聽過這個詞也很正常)
  • iterator stability 確實真的沒聽過,從您文中大概猜得出是 push_back 或 insert 等操作,造成之 iterator end 失效之情形,這部份有空找些資料發篇文。謝謝 novus 意見 :)

    edisonx 於 2012/10/27 10:27 回覆

  • novus
  • 你以為只有 end 會失效嗎?

    vector 的 push_back()、reserve()、erase() 等等不只會造成 end iterator 失效,而是在這個時間點之前取得的所有 iterator 都有可能失效。

    舉例來說
    iter = std::find(v.begin(), v.end(), whatever);
    // ... 若干行後...
    v.reserve(1000);
    do_something(iter); //<-- ?!
    iter 是在 push_back 之前取得,所以很可能已經無效了。

    一個初學者常犯為
    for (it = v.begin(); it != v.end(); ++it) {
    // 在裡面使用讓 it 失效的操作
    }

    其他容器如 map 和 list 就保證不會讓 iterator 失效
  • 嗯嗯,可能我文中意思沒表達清楚,主是要表達 iterator stability 意思之舉例。

    edisonx 於 2012/10/27 20:28 回覆

  • novus
  • 更正:
    [x] iter 是在 push_back 之前取得
    [o] iter 是在 reserve 之前取得
  • 123
  • (5.2) 寫法錯誤 1.while條件設錯 2.v.pop_back()沒有回傳値,不能用cout
    while(v.empty()) cout << v.pop_back() << " ";
  • 謝謝指正,已修改。

    edisonx 於 2013/10/18 10:28 回覆

  • 馬國薰
  • 整理的真的很好
    特別登入感謝分享
  • 很高興有幫助到你 :D

    edisonx 於 2015/04/14 13:51 回覆

  • Hex
  • 最近在學vector翻到這篇想借串問一下
    想請教一下 vector<int> &vi 這邊的 &vi 是什麼意思呢
    是跟文中所提到的 vector<int> v1 同樣的東西嗎?
  • 不一樣, 那是 reference 資料型態。

    edisonx 於 2015/05/19 09:44 回覆

  • 悄悄話

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼