## 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 = {} ```