基本介紹
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
,且裡面沒有元素,所以 size
為 0
。
設定初始值
我們可以使用其內建函式把元素丟進去
設定初始值範例 1 2 3 4 vecotr<int > vec; vec.push_back (1 ); vec.push_back (3 ); vec.push_back (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 ) ;
陣列也可以複製其中一段
1 2 int data[5 ] = {1 , 3 , 5 , 7 , 9 };vector<int > vec (data+2 , data+4 ) ;
基礎使用
下方為 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; 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" ; 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 : 0capacity : 10size : 2capacity : 10- --使用 shrink 後---size : 2capacity : 2
resize() 配置大小,並將新的空間設為 0
1 2 3 4 5 vector<int > vec; vec.resize (10 ); for (auto &v : vec) { cout << v << " " ; }
可以發現原本空的 vector
使用 size()
後,預設為 0
,但如果不想預設為 0
,可以這樣做。
1 2 3 4 5 vector<int > vec; vec.resize (10 , 5 ); for (auto &v : vec) { cout << v << " " ; }
課堂小考
對空的整數型態 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