---
# System prepended metadata

title: C++_vector

---

# 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` 的宇宙擴張學說(如何加大範圍的)，我會再寫的。