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