簡介

Vector 是 STL 內含的一個容器,空間不夠時會自動擴大空間,可以想像成是一個提供許多功能的陣列,它的內部結構其實就是一個動態陣列及其他一些 Data Members 形成的,有許多 Functions 可以使用,非常方便。

使用方式

include

使用前需要先 #include <vector>

變數宣告

  • Vector <Variable type> name
    Variable type:變數型態,如 int, unsigned int, short, char …等等,也可以是自己定義的 Struct 或 Class。

  • Vector <Variable type> name(i)
    建構內含 i 個初始值元素的 Vector。

成員函式

  • 新增與刪除元素

    • push_back(value):新增一個值為 value 的元素到 Vector 的尾端。 當空間不夠時會自己擴大空間。
    • insert(pos, value):新增一個值為 value 的元素到 pos 的前方。
    • insert(pos, num, value):新增 num 個值為 value 的元素到 pos 的前方。
    • erase(pos):刪除位於 pos 的一個元素。
    • erase(begin, end):刪除位於 begin 到 end 之間 ( 不包括 end ) 的所有元素。
    • clear(): 刪除所有元素。

  • 存取元素

    • [i]:存取第 i 個元素。( 從 0 開始 )
    • at(i):存取第 i 個元素 ( 從 0 開始 ) 與上一個的差別在於這種使用這種方式存取會檢查 i 的範圍,大家可以嘗試一下兩者存取超過範圍的元素的差別。
    • front():回傳位於 Vector 的第一個元素。
    • back():回傳位於 Vector 的最後一個元素。

  • 取得長度 / 容量

    • size():取得目前 Vector 內的元素個數。
    • capacity():取得目前 Vector 內動態陣列的大小,通常不會使用到。
    • empty():當 Vector 是空的時候 ( Size 為 0 ) 回傳 True 反之則回傳 False

  • 修改長度 / 容量

    • resize(i):修改 Vector 內的元素個數。( 當 i < 原本的 Size 時,多出來的元素會被清除,當 i > 原本的 Size 時,新增元素的值為初始值 )
    • reserve():修改 Vector 內動態陣列的大小 ( 只能變大不能縮小 ),通常不會使用到。

Iterator

  • begin():回傳一個指向 Vector 內第一個元素位置的 Iterator。
  • end():回傳一個指向 Vector 內最後一個元素後面位置的 Iterator。( 注意不是最後一個元素 )
  • rbegin():回傳一個指向 Vector 內最後一個元素位置的反向 Iterator。
  • rend():回傳一個指向 Vector 內第一個元素位置的反向 Iterator。

補充

Size ( 長度 ) 與 Capacity ( 容量 ) 的差別:Size 代表的是這個陣列裡面放置的元素數量,而 Capacity 則是代表這個陣列的大小。例如:

1
2
3
4
int *Vec = new int[5]();

Vec[0] = 1;
Vec[1] = 2;

此時 Vector 的 Size 就是 2,而 Capacity 就是 5。Size 可以擴大也能縮小,但 Capacity 只能擴大無法縮小。一般在使用 Vector 時只須注意 Size 即可,因為當 Capacity 不夠需要擴大時 Vector 會自動幫我們擴大。

簡單實作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
#include <vector>
using namespace std;

void output(vector< int >& Vec) // 印出 Vector 內的所有元素及 Vector 的 Size
{
cout << "Vector 內的元素: ";
for (size_t i = 0; i < Vec.size(); ++i)
cout << Vec[i] << " ";
cout << endl << "Vector 的 Size : ";
cout << Vec.size();
if (Vec.empty())
cout << endl << "Vector.empty() : True";
else
cout << endl << "Vector.empty() : False";
cout << endl << endl;
}

int main()
{
vector<int> Vec;

Vec.push_back(2);
Vec.push_back(1);
output(Vec);
// 2 1
// 2
// False

Vec.insert(Vec.begin(), 3);
output(Vec);
// 3 2 1
// 3
// False

Vec.insert(Vec.begin(), 2, 4);
output(Vec);
// 4 4 3 2 1
// 5
// False

Vec.erase(Vec.begin() + 2);
output(Vec);
// 4 4 2 1
// 4
// False

Vec.erase(Vec.begin(), Vec.begin() + 2);
output(Vec);
// 2 1
// 2
// False

Vec.clear();
output(Vec);
//
// 0
// True

for (int i = 1; i < 10; ++i)
Vec.push_back(i);
output(Vec);
// 1 2 3 4 5 6 7 8 9
// 9
// False

cout << "Vector.front(): "<< Vec.front() << endl;
// 1
cout << "Vector.back(): " << Vec.back() << endl;
// 9
cout << "Vector[1]: " << Vec[1] << endl;
// 2
cout << "Vector.at(1): " << Vec.at(1) << endl << endl;
// 2

Vec.resize(5);
output(Vec);
// 1 2 3 4 5
// 5
// False

Vec.resize(9);
output(Vec);
// 1 2 3 4 5 0 0 0 0
// 9
// False

for (vector< int >::iterator it = Vec.begin(); it != Vec.end(); ++it)
cout << *it << " ";
cout << endl << endl;
// 1 2 3 4 5 0 0 0 0

for (vector< int >::reverse_iterator it = Vec.rbegin(); it != Vec.rend(); ++it)
cout << *it << " ";
cout << endl << endl;
// 0 0 0 0 5 4 3 2 1
}

參考資料

<vector> - C++ Reference
C/C++ - Vector (STL) 用法與心得完全攻略
[教學]C++ Vector 詳細用法