---
# System prepended metadata

title: vector
tags: [資料結構, vector]

---

 **C++ `vector` **

---

## 🎯 教學目標

- 瞭解 C++ `vector` 的基本概念與語法
- 使用常見的 `vector` 操作方法
- 撰寫簡單的程式來操作與應用 `vector`

---

## 🧠 一、vector 是什麼？

- `vector` 是 C++ 標準模板庫（STL）提供的一種**動態陣列**，可以自動調整大小。
- 優點：不像陣列需要預先定義大小，適合資料筆數不固定的情境。

---

## 📌 二、基本語法

```cpp
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> numbers; // 建立一個空的整數 vector

    numbers.push_back(10); // 加入元素
    numbers.push_back(20);
    numbers.push_back(30);

    cout << "第一個元素是：" << numbers[0] << endl;

    return 0;
}
```

---

## 🧰 三、常見的 vector 方法與操作

| 方法 | 說明 | 範例 |
|------|------|------|
| `push_back(x)` | 在尾端加入元素 | `v.push_back(5);` |
| `size()` | 回傳元素個數 | `v.size();` |
| `empty()` | 判斷是否為空 | `v.empty();` |
| `pop_back()` | 移除最後一個元素 | `v.pop_back();` |
| `at(index)` | 安全地取得指定位置元素 | `v.at(2);` |
| `clear()` | 清空所有元素 | `v.clear();` |
| `insert()` | 插入元素 | `v.insert(v.begin() + 1, 99);` |
| `erase()` | 刪除指定位置元素 | `v.erase(v.begin() + 2);` |
| `begin()` / `end()` | 回傳迭代器起始與結束位置 | `for (auto it = v.begin(); it != v.end(); it++)` |

---

## 💡 四、範例一：輸入 5 個整數並輸出總和

```cpp
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> nums;
    int input;

    for (int i = 0; i < 5; i++) {
        cout << "輸入第 " << i + 1 << " 個數字：";
        cin >> input;
        nums.push_back(input);
    }

    int sum = 0;
    for (int i = 0; i < nums.size(); i++) {
        sum += nums[i];
    }

    cout << "總和是：" << sum << endl;
    return 0;
}
```

---

## 🌟 範例二：刪除特定位置元素

```cpp
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v = {10, 20, 30, 40, 50};

    v.erase(v.begin() + 2); // 刪除索引為 2 的元素（30）

    cout << "目前內容：";
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    cout << endl;

    return 0;
}
```

---

## 🧪 範例三：使用 `insert` 插入元素

```cpp
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v = {1, 2, 4, 5};

    v.insert(v.begin() + 2, 3); // 在位置 2 插入 3

    cout << "結果：";
    for (int x : v) {
        cout << x << " ";
    }

    return 0;
}
```

---

## 🎲 延伸挑戰練習１

1. 使用 `vector<string>` 儲存學生姓名，並輸出所有人名。
2. 輸入任意整數直到輸入 -1 為止，輸出平均值（使用 `vector` 儲存）。
3. 撰寫一個函式接收 `vector<int>` 並回傳最大值。

---
## 🎲 延伸挑戰練習２—大數相加
經典的應用情境題：**處理超過 `long long` 範圍的超大數加法問題**。  
C++ 中可以用 `vector<int>` 來模擬每一位數字，進行「逐位加法 + 進位」的操作。

---

## 🧠 核心概念
- 將每個超大數字以「**字串形式倒著存入 vector**」
- 每一位用一個 `int` 儲存（通常為 0~9）
- 手動模擬加法，處理進位

---

## ✅ 程式碼範例：兩個超大數字相加

```cpp
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

// 將數字字串轉成反向 vector（每個數字一位）
vector<int> stringToVector(const string& num) {
    vector<int> result;
    for (int i = num.length() - 1; i >= 0; i--) {
        result.push_back(num[i] - '0'); // 把字元轉成數字
    }
    return result;
}

// 相加兩個大數字 vector
vector<int> addBigNumbers(const vector<int>& a, const vector<int>& b) {
    vector<int> result;
    int carry = 0;
    int maxSize = max(a.size(), b.size());

    for (int i = 0; i < maxSize; i++) {
        int digitA = (i < a.size()) ? a[i] : 0;
        int digitB = (i < b.size()) ? b[i] : 0;
        int sum = digitA + digitB + carry;
        result.push_back(sum % 10);
        carry = sum / 10;
    }

    if (carry > 0) {
        result.push_back(carry);
    }

    return result;
}

// 印出 vector（要反過來印）
void printVectorNumber(const vector<int>& v) {
    for (int i = v.size() - 1; i >= 0; i--) {
        cout << v[i];
    }
    cout << endl;
}

int main() {
    string num1, num2;
    cout << "請輸入第一個超大數字：";
    cin >> num1;
    cout << "請輸入第二個超大數字：";
    cin >> num2;

    vector<int> a = stringToVector(num1);
    vector<int> b = stringToVector(num2);
    vector<int> sum = addBigNumbers(a, b);

    cout << "相加結果是：";
    printVectorNumber(sum);

    return 0;
}
```

---

## 🧪 範例輸入
```
請輸入第一個超大數字：987654321987654321987654321
請輸入第二個超大數字：123456789123456789123456789
```

## 📤 輸出結果
```
相加結果是：1111111111111111111111111110
```

---

