# 【STL-Vector】攻略 ###### tags: `STL` ## 一、Vector簡介 Vector是C++標準程式庫中的一個類別,可視為會自動擴展容量的陣列,以循序(Sequential)的方式維護變數集合。vector的特色有支援隨機存取,在集合尾端增刪元素很快,但是在集合中間增刪元素比較費時。 可以將其看成array的「升級版」,擁有更多功能。 ## 二、成員函式 需先引入標頭檔 \<vector> ### 存取元素方法 * vec[i] - 存取索引值為 i 的元素參照。 (索引值從零起算) * vec.at(i) - 存取索引值為 i 的元素的參照,以 at() 存取會做陣列邊界檢查,如果存取越界將會拋出一個例外,這是與operator[]的唯一差異。 * vec.front() - 回傳 vector 第一個元素的參照。 * vec.back() - 回傳 vector 最尾端元素的參照。 ### 新增或移除元素的方法 * vec.push_back() - 新增元素至 vector 的尾端,必要時會進行記憶體組態。 * vec.pop_back() - 刪除 vector 最尾端的元素。 * vec.insert() - 插入一個或多個元素至 vector 內的任意位置。 * vec.erase() - 刪除 vector 中一個或多個元素。 * vec.clear() - 清空所有元素。 ### 取得長度/容量 * vec.size() - 取得 vector 目前持有的元素個數。 * vec.empty() - 如果 vector 內部為空,則傳回 true 值。 * vec.capacity() - 取得 vector 目前可容納的最大元素個數。這個方法與記憶體的組態有關,它通常只會增加,不會因為元素被刪減而隨之減少。 ### 重新組態/重設長度 * vec.reserve() - 如有必要,可改變 vector 的容量大小(組態更多的記憶體)。在眾多的 STL 實例,容量只能增加,不可以減少。 * vec.resize() - 改變 vector 目前持有的元素個數。 ### 迭代 (Iterator) * vec.begin() - 回傳一個Iterator,它指向 vector 第一個元素。 * vec.end() - 回傳一個Iterator,它指向 vector 最尾端元素的***下一個位置***(它不是最末元素)。 * vec.rbegin() - 回傳一個反向Iterator,它指向 vector 最尾端元素的。 * vec.rend() - 回傳一個Iterator,它指向 vector 的第一個元素的前一個位置。 示範: ```c++=1 ``` ## 常用寫法 ### 訪問 ```c++=1 #include <iostream> #include <vector> int main() { std::vector<int> v1 = {5,3,2,1,4}; // operator [] for (int i = 0; i < v1.size(); i++) std::cout << v1[i] << ' '; // c++11才有的for寫法 for (int i : v1) std::cout << i << ' '; // at函式 for (int i = 0; i < v1.size(); i++) std::cout << v1.at(i) << ' '; // iterator 迭代器 std::vector<int>::iterator ite_v1; for (ite_v1 = v1.begin(); ite_v1 != v1.end(); ite_v1++) std::cout << *ite_v1 << ' '; return 0; } ``` ### 定義vector 定義一個一維vector,列10格(最大值為v[9]),且元素值預設為0。 ```c++=1 std::vector<int> v(10,0); ``` 定義一個二維vector,內含行10格、列10格(最大值為v[9][9]),且元素值預設為0。 * 第一種方法: ```c++=1 std::vector<std::vector<int>> v(10, std::vector<int>(10,0)); ``` * 第二種方法: ```c++=1 #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<std::vector<int>> v; v.resize(10); for (int i = 0; i < v1.size(); i++) v[i].resize(10,0); return 0; } ``` ### 排序 (升序) ```c++=1 #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> v1 = {5,3,2,1,4}; std::sort(v1.begin(), v1.end()); for (int i : v1) std::cout << i << ' '; return 0; } ``` ### 排序 (降序) 三種方式: * 比較副函式 * lambda function 匿名函式 * 利用反迭代 ```c++=1 #include <iostream> #include <vector> #include <algorithm> bool compare(int a, int b) { return a > b; } int main() { std::vector<int> v1 = {5,3,2,1,4}; std::sort(v1.begin(), v1.end(), compare); // first way /*std::sort(v1.begin(), v1.end(), [](int a, int b) { // second way return a > b; }); */ // std::sort(v1.rbegin(), v1.rend()); // third way for (int i : v1) std::cout << i << ' '; return 0; } ```