# vector
## 什麼是 vector?
`vector` 是 `C++` 標準庫中的一種**容器**,類似於動態陣列,能夠自動調整大小,並且提供比陣列更靈活的操作方式。
## vector 的基本語法
```cpp=
#include <vector> //要用這個標頭檔
using namespace std;
vector<資料類型> 名稱;
//vector 是容器類型,資料類型 代表向量內儲存的資料型別。
//名稱是你為該 vector 指定的名稱,一樣,不違反命名原則都可以。
```
## 宣告與初始化 vector
### 方法 1:宣告空 vector
```cpp
vector<int> v1; // 宣告一個整數型別的 empty vector
```
### 方法 2:初始化並指定大小
```cpp
vector<int> v2(5, 10); // 初始化一個大小為 5 的vecotr,並設為每個元素的值為 10 ,所以變成 -> {10, 10, 10, 10, 10}
```
### 方法 3:使用初始化列表
```cpp
vector<int> v3 = {1, 2, 3, 4, 5}; // 用初始化列表初始化向量
```
## 常用 vector 操作
### **如何加入元素**
`push_back()`:將元素添加到 `vector` 的末端。
```cpp
vector<int> v = {1, 2, 3};
v.push_back(4);
```
把數字 $4$ 塞進屁股(我是這樣記憶的XDDD),他就會變成$1, 2, 3, 4$。
反正要怎麼記開心就好 :}。
### **如何刪除元素**
`pop_back()`:把 `vector` 最後一個元素刪掉。
```cpp
v.pop_back(); // 刪除最後一個元素
```
這部分我在社課時不小心講成 `pop()` ,應該要說還有 `underscore` 和 `back` ,我很抱歉。
### 獲取元素數量 || vector長度
`size()`:返回 `vector` 中元素的數量。
```cpp
cout << v.size(); // 輸出vector大小
```
### 訪問元素
[ ]:用索引訪問元素。
> 為什麼可以這樣??
因為 `vector` 是**連續記憶體**(就跟Array陣列一樣),所以可以這樣搞。
```cpp
cout << v[0]; // 輸出第一個元素
```
`at()` :用 `at()` 訪問元素,具有範圍檢查功能。這我很少用,也是問AI才知道的。
```cpp
cout << v.at(0); // 輸出第一個元素,若越界會報錯
```
### 清空 vector
`clear()`:清除 `vector` 中的**所有元素**。
```cpp=
v.clear(); // 清空vector
```
## vector 的範例
### eg.1:for loop 遍歷 vector 元素
```cpp=
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4, 5};
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " "; // 使用索引遍歷向量
}
cout << endl;
return 0;
}
```
輸出:
```
1 2 3 4 5
```
### eg.2:使用範圍型 for 遍歷 vector //超好用
```cpp=
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4, 5};
for (const int& val : v) { //以 & 提高效率
cout << val << " "; // 使用範圍型 for 遍歷向量
}
cout << endl;
return 0;
}
```
輸出:
```
1 2 3 4 5
```
## vector 的進階操作
### 使用 insert() 插入元素
`insert()` 允許在指定位置插入元素。
```cpp
vector<int> v = {1, 2, 3};
v.insert(v.begin() + 1, 5); // 在第二個位置插入數字 5
```
### 使用 erase() 刪除元素
`erase()` 允許刪除指定位置的元素。
```cpp
v.erase(v.begin() + 1); // 刪除第二個元素
```
上面兩個操作的**時間複雜度**會花比較長!!!!
## 小結
看到最後,有沒有很好奇什麼是**時間複雜度**呢?
別擔心,之後會看到的。
至於 `vector` 的宇宙擴張學說(如何加大範圍的),我會再寫的。