【筆記】vector

基本介紹

vector 是一個可以改變大小的容器,可以說是升級版的陣列,vector 更能夠高效地對記憶體進行管理及動態增長。

如何宣告

先引入標頭檔 #include <vector>

基礎宣告

基礎宣告範例
1
2
3
4
5
6
7
8
#include <iostream>
#include <vector>
using namespace std;

int main() {
vector<int> vec;
return 0;
}

vec 為存取 int 型別的 vector,且裡面沒有元素,所以 size0

設定初始值

我們可以使用其內建函式把元素丟進去

設定初始值範例
1
2
3
4
vecotr<int> vec;
vec.push_back(1); // vec = {1};
vec.push_back(3); // vec = {1, 3};
vec.push_back(5); // vec = {1, 3, 5};

也可以直接寫成一行

設定初始值範例
1
vector<int> vec = {1, 3, 5};

或者

設定初始值範例
1
vector<int> vec({1, 3, 5});

若想要複製一份相同的 vector,可以這樣做

1
2
3
4
vector<int> vec_1 = {1, 3, 5};
vecotr<int> vec_2 = vec_1;
// 當然這句也可以寫成
vector<int> vec_2(vec_1);

也可以複製一份陣列

1
2
int data[3] = {1, 3, 5};
vector<int> vec(data, data+3);

還可以複製其中一段就好

1
2
vector<int> vec_1 = {1, 3, 5, 7, 9};
vector<int> vec_2(vec_1.begin() + 2, vec_1.end() - 1); // vec_2 = {5, 7};

陣列也可以複製其中一段

1
2
int data[5] = {1, 3, 5, 7, 9};
vector<int> vec(data+2, data+4); // vec = {5, 7};

基礎使用

下方為 vector 可用的函式,有誤還請多指教

vector 函式 功能
begin(), end(), cbegin(), cend() 提供正向跌代器
rbegin(), rend(), crbegin(), crend() 提供反向跌代器
size() 返回 vector 大小
max_size() 返回 vector 最大大小(因為 vector 的大小是隨者元素的多寡而增加,所以數字極大)
resize() 配置 vector 大小,且補滿 0
capacity() 返回目前 vector 配置大小
empty() 判斷 vector 是否為空
reserve() 配置 vector 大小
shrink_to_fit() 釋放 vector 未使用的空間
at(), operator[] 取得元素
front() 返回第一個元素
back() 返回最後一個元素
data() 返回元素的指標
assign() 配置 (0~n) 的數值
push_back() 先複製一份要 push_back 的元素,再貼在 vector 後面
pop_back() 刪除最後一個元素
insert() 插入元素
erase() 刪除一個或一段元素
clear() 清空 vector 內的元素
swap() 交換兩個 vector 元素

查看更多可參考 cplusplus 官網

基礎操作

正向遍歷

1
2
3
4
vector<int> vec({1, 3, 5, 6});
for (auto it = vec.begin(); it < vec.end(); it++) {
cout << *it << "\n";
}

反向遍歷

1
2
3
4
vector<int> vec({1, 3, 5, 6});
for (auto it = vec.rbegin(); it < vec.rend(); it++) {
cout << *it << "\n";
}

size() 與 max_size() 差異

1
2
3
vector<int> vec({1, 3, 5, 6});
cout << "size: " << vec.size() << "\n";
cout << "max_size: " << vec.max_size() << "\n";
1
2
3
輸出:
size: 4
max_size: 4611686018427387903

size() 與 capacity() 差異

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vector<int> vec({1});
cout << "vec size: " << vec.size() << "\n";
cout << "vec capacity: " << vec.capacity() << "\n";
vec.push_back(10);
cout << "vec size: " << vec.size() << "\n";
cout << "vec capacity: " << vec.capacity() << "\n";
vec.push_back(10);
cout << "vec size: " << vec.size() << "\n";
cout << "vec capacity: " << vec.capacity() << "\n";
vec.push_back(10);
cout << "vec size: " << vec.size() << "\n";
cout << "vec capacity: " << vec.capacity() << "\n";
vec.push_back(10);
cout << "vec size: " << vec.size() << "\n";
cout << "vec capacity: " << vec.capacity() << "\n";
vec.push_back(10);
cout << "vec size: " << vec.size() << "\n";
cout << "vec capacity: " << vec.capacity() << "\n";
vec.push_back(10);
cout << "vec size: " << vec.size() << "\n";
cout << "vec capacity: " << vec.capacity() << "\n";
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
輸出:
vec size: 1
vec capacity: 1
vec size: 2
vec capacity: 2
vec size: 3
vec capacity: 4
vec size: 4
vec capacity: 4
vec size: 5
vec capacity: 8
vec size: 6
vec capacity: 8
vec size: 7
vec capacity: 8

可以發現,使用 size() 時,元素個數及為 size,而使用 capacity() 時,回傳目前 vector 預先給予的空間大小,且如果超過預先給予的空間大小,空間會再給予 兩倍 的空間。

reserve() 預先配置 vector 如器大小

若想要預先給予固定的空間大小,可以使用 reserve()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vector<int> vec({1});
vec.reserve(3);
cout << "vec size: " << vec.size() << "\n";
cout << "vec capacity: " << vec.capacity() << "\n";
vec.push_back(10);
cout << "vec size: " << vec.size() << "\n";
cout << "vec capacity: " << vec.capacity() << "\n";
vec.push_back(10);
cout << "vec size: " << vec.size() << "\n";
cout << "vec capacity: " << vec.capacity() << "\n";
vec.push_back(10);
cout << "vec size: " << vec.size() << "\n";
cout << "vec capacity: " << vec.capacity() << "\n";
vec.push_back(10);
1
2
3
4
5
6
7
8
9
輸出:
vec size: 1
vec capacity: 3
vec size: 2
vec capacity: 3
vec size: 3
vec capacity: 3
vec size: 4
vec capacity: 6

可以再次發現,若元素長度大於預先設置的空間大小,capacity() 依舊以 兩倍的方式增大

使用 shrink_to_fit() 將未使用的空間釋放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vector<int> vec;
// 使用 shrink 前
cout << "---使用 shrink 前---\n";
vec.reserve(10);
cout << "size: " << vec.size() << "\n";
cout << "capacity: " << vec.capacity() << "\n";
vec.push_back(1);
vec.push_back(1);
cout << "size: " << vec.size() << "\n";
cout << "capacity: " << vec.capacity() << "\n";
// 使用 shrink 後
cout << "---使用 shrink 後---\n";
vec.shrink_to_fit();
cout << "size: " << vec.size() << "\n";
cout << "capacity: " << vec.capacity() << "\n";
1
2
3
4
5
6
7
8
9
輸出:
---使用 shrink 前---
size: 0
capacity: 10
size: 2
capacity: 10
---使用 shrink 後---
size: 2
capacity: 2

resize() 配置大小,並將新的空間設為 0

1
2
3
4
5
vector<int> vec;
vec.resize(10);
for (auto &v : vec) {
cout << v << " ";
}
1
2
輸出:
0 0 0 0 0 0 0 0 0 0

可以發現原本空的 vector 使用 size() 後,預設為 0,但如果不想預設為 0,可以這樣做。

1
2
3
4
5
vector<int> vec;
vec.resize(10, 5);
for (auto &v : vec) {
cout << v << " ";
}
1
2
輸出:
5 5 5 5 5 5 5 5 5 5

課堂小考

對空的整數型態 vector 使用 resize(10.5, 3.3) 後,capacity() 變為多少,且元素設定為多少。
A. capacity: 11,且元素皆為 4
B. capacity: 11,且元素皆為 3
C. capacity: 10,且元素皆為 3
D. capacity: 10,且元素皆為 4
E. Run Time Error

解答

選項 C