Semorphe

vector

一排東西,而且長度可以變。 · ⏱ 約 30 分鐘

你會學到三件事

  1. vector長度會變的陣列
  2. push_back 往後面加、size() 問現在幾個
  3. 範圍 for:不管位置,只要每一個

開始之前

上一課的陣列有一個硬限制:格數在寫程式的時候就要決定

int n;
cin >> n;
int a[n];     // ⚠️ 標準 C++ 不允許

而「要幾格」常常要等程式跑起來才知道。vector 解決這件事。

一、一開始是空的

vector<int> v;
這一段 意思
vector 一排會變長的東西
<int> 裡面每一格裝整數
v 名字

⚠️ 沒有 [5]——它一開始是空的,一格都沒有。

那個角括號 <int> 是新的寫法。它的意思是「這個 vector 是裝 int 的」。 換成 vector<string> 就是裝字串的。

二、往後面加

v.push_back(3);
v.push_back(1);
v.push_back(4);
cout << v.size() << endl;    // 3

又是第 7 課那個「點」的寫法:點的左邊是誰,右邊是問它什麼/叫它做什麼

寫法 做什麼
v.push_back(x) 最後面加一個 x,長度加一
v.size() 現在有幾個
v.back() 最後一個是什麼
v.pop_back() 把最後一個丟掉,長度減一

⚠️ v.pop_back() 不會把那個值還給你——它只是丟掉。 要先 v.back() 拿到再 pop_back()

三、拿第幾個

和陣列一模一樣:

cout << v[0] << endl;    // 3

位置一樣從 0 開始,v[v.size()] 一樣不存在。 ⚠️ vector 也不會攔你越界——它跟陣列一樣危險。

四、範圍 for

想走過每一個而不在乎位置的時候,有更短的寫法:

for (int x : v) {
    cout << x << endl;
}

讀法:「v 裡面的每一個 x,做這件事。」

它和 for (int i = 0; i < v.size(); i++) 走的是同一批東西,差別是:

拿得到位置 適合什麼
for (int i = 0; ...) 要知道「這是第幾個」
for (int x : v) 只要每一個值——不會寫錯邊界

不需要位置的時候用範圍 for。 少一個地方會寫錯,就是少一個 bug。

完成的樣子

int main() {
    vector<int> v;
    v.push_back(3);
    v.push_back(1);
    v.push_back(4);
    cout << v.size() << endl;
    for (int x : v) {
        cout << x << endl;
    }
    return 0;
}

換你了

改成讀進使用者輸入的數字,直到輸入 0 為止,然後印出總共幾個。

提示:while (true) + 讀一個 + if (x == 0) break;push_back

這一課你做了什麼

如果卡住了

你看到 多半是因為
vector 說沒宣告 目標不是 C++(C 沒有 vector)——看一下右下角
v[0] 拿到怪東西 vector 一開始是空的。要先 push_back
範圍 for 改了值卻沒生效 for (int x : v)x複本。要改要寫 for (int& x : v)
size() 比預期少一 pop_back() 多做了一次
在編輯器打開這一課 →