## vector
c++ 中的`vector`其實也是一個陣列(array),只是它是一個動態陣列(dynamic array ),提供高效的方法來儲存及管理大小可變的陣列
### 特性
1. 動態調整記憶體大小(不用事先定義大小)
2. 連續記憶體分配(跟內建`array`一樣,快速訪問每個元素)
3. 自動管理記憶體(不需要手動釋放)
## 使用時機
1. 未知陣列大小
2. 需要`STL`的其他功能(如演算法)與集合(array)合併使用時
## 程式碼區
### 1. 函式庫引入
```cpp=
#include <vector>
```
### 2. 初始化
1. 基本定義
```=
vector<資料型態>名字;
```
:::warning
1. 名字不能是保留字 [C++ 筆記: 保留字](/80Y4ImqXQGGTQvr3gqbTYA)
2. 資料型態不一定只有`int`、`char`之類的,像`vector`、`stack` 也可以當資料型態喔
:::
ex:
```cpp=
vector<int>vec;
```
2. 定義大小( 是用()不是用[] )
```cpp=
vector<int>vec(2);
```
3. 定義陣列裡內容
```cpp=
// 1
vector<int>vec({1, 2, 3});
// 2
vector<int>vec = {1, 2, 3};
```
4. 布林值(要加陣列大小,不然預設是一格)
```cpp=
vector<int>vec(5, true);
```
5. 複製全部陣列
```cpp=
// 1
vector<int>vec1({1, 2, 3});
vector<int>vec2 = vec1;
// 2
vector<int>vec({1, 2, 3});
vector<int>vec2(vec1);
```
6. 複製部分陣列(運用[迭代器](###迭代器))
```cpp=
vector<int>vec1({1, 2, 3, 4, 5});
auto it = vec1.begin(); // 迭代器(iterator)
vector<int>vec2(it, it+3); //vec1[0] ~ vec[2]
//vec2 = {1, 2, 3};
```
7. 從傳統陣列轉為vector
```cpp=
int mp[3] = {1, 2, 3};
vector<int>vec = (mp, mp+3);
```
8. 複製部分傳統陣列
```cpp=
int mp[5] = {1, 2, 3, 4, 5};
vector<int>vec(n+2, n+4); // //mp[2] ~ mp[3]
//vec = {3, 4}
```
### 3. 存取鎮列元素
跟傳統陣列一樣。 [C++筆記 : 陣列(array)](/fQ1G92lGQai2_liqm9mIxQ)
### 4. 讀取陣列中元素
```cpp=
vector<int>vec({1, 2, 3});
// 1
for (int i = 0; i < vec.size(); i++)
cout << vec[i] << " "; // 1 2 3
// 2(推薦,超好用的)
for (auto v : vec)
cout << v << " "; // 1 2 3
// 3(盡量用auto 來代替,但建議只有迴圈跟迭代器這樣用,否則你的程式碼可讀性會變得很低)
for (vector<int>v : vec)
cout << v << " "; // 1 2 3
```
### 5. 增減元素
1. 新增在後面
```cpp=
vector<int>vec({1, 2, 3});
// 1
vec.push_back(4); // vec = {1, 2, 3, 4}
// 2(比push_back 快一點)
vec.emplace_back(5); //vec = {1, 2, 3, 4, 5}
```
2. 刪除後面
```cpp=
vector<int>vec({1, 2, 3});
vec.pop_back(); // vec = {1, 2}
```
3. 新增特定位置(運用[迭代器](###迭代器))
```cpp=
// 1個
vector<int>vec({1, 2, 3});
vec.insert(vec.begin()+2, 4); // vec = {1, 2, 4, 3}
//多個
vector<int>vec1({1, 2, 3});
vector<int>vec2({4, 5, 6});
vec1.insert(vec1.begin() + 1, vec2.begin(), vec2.end());
//vec1 = {1, 4, 5, 6, 2, 3}
```
4. 刪除特定位置(運用[迭代器](###迭代器))
```cpp=
vector<int>vec({1, 2, 3});
vecerase(vec.begin(), vec.end()); //vec = {}
vector<int>vec1({1, 2, 3});
vector<int>vec2({2, 3, 4});
vec1.erase(vec2.begin(), vec2.end()); //vec1 = {1}
```
### 6. 迭代器
> 通常搭配迴圈以及條件式使用,也可以用來取某段陣列中的元素
```cpp=
vector<int>vec({1, 2, 3});
//1. vec.begin() : 取第一個的前面一個(從第一開始)
cout << vec.begin();
//2. vec.end() : 0 取最後一個的後面一個(從第一開始)
cout << vec.end();
//3. vec.rbegin() : 取最後一個的後面一個(從最後一個開始)
cout << vec.rbegin();
//4. vec.rend() : 0 取第一個的前面一個(從最後一個開始)
cout << vec.rend();
```
### 7. 其他函式
1. 判斷長度 `.size()`
> 通常搭配`for`迴圈做使用,當最迴圈的中止條件
```cpp=
vector<int>vec({1, 2, 3});
cout << vec.size(); // 3
```
2. 判斷是否為空 `.empty()`
> 通常搭配`if`、`while`之類的條件是做使用
```cpp=
vector<int>vec({1, 2, 3});
cout << vec.empty(); // 0(false)
```
3. 清空vector陣列
```cpp=
vector<int>vec({1, 2, 3})l
vec.clear() // vec = {}
```