# 【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;
}
```