**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
```
---