---
# System prepended metadata

title: 【STL-Vector】攻略
tags: [STL]

---

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

