**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 1. 使用 `vector<string>` 儲存學生姓名,並輸出所有人名。 2. 輸入任意整數直到輸入 -1 為止,輸出平均值(使用 `vector` 儲存)。 3. 撰寫一個函式接收 `vector<int>` 並回傳最大值。 --- ## 🎲 延伸挑戰練習2—大數相加 經典的應用情境題:**處理超過 `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 ``` ---