# 簡介 其為STL(Standard Template Library)清單中之陣列,跟傳統陣列差別在可不預先設置大小,但其需先引入函式。 ```cpp= #include <vector> ``` # 語法 設置vector時,使用左箭頭與右箭頭包住資料型態。 ```cpp= vector<變數型態> 名稱; vector<int> vec1; vector<int> vec2(n); //大小為n。 vector<int> vec3(n, 1); //大小為n,每個值預設為1。 vector<int> vec4 = {1, 2, 3, 4, 5}; //自動調整大小為5。 //二維vector。 vector<vector<int>> vec5(m, vector<int>(n, 1)); // m行,n列,每個值預設為1。 ``` --- <font color="#EB6E41">與傳統陣列一樣</font>,利用`[ ]`來取得陣列位置中的資料。 ```cpp= vector<int> vec(3); for(int i = 0; i < 3; i++) cin >> vec[i]; //輸入1 2 3。 cout << vec[0] << ' ' << vec[1] << ' ' << vec[2]; //輸出1 2 3。 ``` :::info ::: spoiler .at() 因為他的功能跟傳統陣列的`[ ]`幾乎一樣,所以放在這不放在內建函式。 ```cpp= vector<int> vec(3); for(int i = 0; i < 3; i++) cin >> vec.at(i); //輸入1 2 3。 cout << vec.at(0) << ' ' << vec.at(1) << ' ' << vec.at(2); //輸出1 2 3。 ``` 他會執行邊界檢查,如果索引超出範圍,會回傳`std::out_of_range` 。 ```cpp= vector<int> vec = {1, 2, 3}; cout << vec.at(5) ; //輸出 std::out_of_range 。 ``` ::: # 內建函式 ## .size() & .capacity() `.size()` 和 `.capacity()` 皆可取得陣列大小。 ```cpp= vector<int> vec(10); cout << vec.size() << '\n'; //輸出 10。 cout << vec.capacity() << '\n'; //輸出 10。 ``` 前者看的是元素數量,後者看的是容器大小,配合 `.resize()` 和 `.reserve()` 可看出差異。 ## .empty() `.empty()` 在容器內部是空的時傳回 `true` 。 ```cpp= vector<int> vec; cout << (vec.empty()) << '\n'; //輸出 1。 ``` ## .front() & .back() `.front()` 可以存取 (<font color="#EB6E41">不移出</font>) 向量頭端的元素,`.back()` 可以存取 (<font color="#EB6E41">不移出</font>) 尾端的元素。 ```cpp= vector<int> vec = {3, 4, 5, 6, 7}; cout << (vec.front() = 4); //輸出 4。 cout << (vec.back() = 8); //輸出 8。 cout << (vec.front() == 4); //輸出 1。 cout << (vec.back() == 7); //輸出 0。 ``` ## .push_back() & .emplace_back() 在容器的尾端增加元素。 `push_back`會先複製一個欲新增的元素再加入到容器尾端,接著把複製的元素刪除。 `emplace_back`會直接在容器最後新增一個位置,值設為指定的值。 所以大部分時候`emplace_back`的運行速度較快(沒差多少),但建議用`push_back`會比較好,因為`emplace_back`會在該錯誤時沒有報錯。 ```cpp= vector<int> vec; vec.push_back(10); // vec = {10}。 vec.push_back(20); // vec = {10, 20}。 ``` ## .pop_back() 刪除容器的尾端元素。 ```cpp= vector<int> vec = {1, 2, 3, 4, 5}; vec.pop_back(); // vec = {1, 2, 3, 4}。 vec.pop_back(); // vec = {1, 2, 3}。 ``` ## .insert() & .erase() `.insert()`在容器中的指定位置插入,若插入元素的條件為 n,則在後一項輸出 n 個數值 。(若不含插入元素則預設為1。) `.erase()`刪除容器中中的指定位置,直到結束的位置。(若不含結束的位置則預設為1。) 需要配合疊代器(iterator),看看就好,基本的資料存取用不到。 ```cpp= vec.insert(插入的位置,(插入多少元素), 數值) vector<int> vec = {1, 2, 3}; vec.insert(vec.begin() + 1, 7); // vec = {1, 7, 2, 3}。 vec.insert(vec.end(), 2, 4); // vec = {1, 7, 2, 3, 4, 4}。 v.erase(刪除的位置,(結束的位置)) vector<int> v = {1, 2, 3, 4}; v.erase(v.begin() + 1); // vec = {1, 3, 4}。 v.erase(v.begin(), v.begin() + 2); // vec = { }。 ``` ## .clear() 清除vector中的所有元素。 ```cpp= vector<int> vec = {1, 2, 3}; vec.clear(); ``` ## .resize() & .reserve() `.resize()` 和 `.reserve()` 皆可調整陣列大小。 `.resize()` 的新大小若大於當前大小,會新增元素,反之則會移除多餘的元素。 ```cpp= vector<int> vec = {1, 2, 3}; vec.resize(5); // vec = {1, 2, 3, 0, 0} 。 vec.resize(2); // vec = {1, 2} 。 vector<int> v; v.reserve(10); cout << v.capacity() ; // 輸出 10。 cout << v.size() ; // 輸出 0。 v.push_back(1); // 新增元素。 cout << v.capacity() ; // 輸出 10。 cout << v.size() ; // 輸出 1。 ``` 再說一次,前者看的是元素數量,後者看的是容器大小。 # 例題 沒有例題,自己去 [array 陣列](https://hackmd.io/@PoteLiu/BkInPx92R) 找。 ###### 都看到這了難道不按個愛心支持一下嗎?