C++ vector中的resize,reserve,size和capacity函数讲解
前言
在介紹resize(),reserve(),size()和capacity()函數之前,先簡單介紹一下c++中vector的概念。
vector:順序容器(可變大小數組)。支持快速隨機訪問。在尾部之外的位置插入或刪除元素可能很慢。
既然vector是個容器,那么一定相關特性,如添加元素、刪除元素和查詢容器大小等操作。本文重點介紹vector中的resize(),reserve(),size()和capacity()函數。
基本概念
capacity
指容器在分配新的存儲空間之前能存儲的元素總數。
size
指當前容器所存儲的元素個數
注:capacity是容器可存儲的最大總數,size是當前容器存儲的個數。還不理解,看我畫的圖(畫風雖怪,但言簡意賅)。
既分配了空間,也創建了對象。
這里空間就是capacity,對象就是容器中的元素。
reserve()表示容器預留空間,但不是真正的創建對象,需要通過insert()或push_back()等操作創建對象。
其實size()和capacity()沒有更多需要介紹的地方,大家平時coding時直接調用即可。當然size()的使用頻率相當高,通常進行遍歷操作時,最外層的for循環的次數即為size()。
resize和reverse
區別
代碼實例
代碼解析
操作1
vector<int> v1; vector<int> v2; vector<int> v3; vector<int> v4;- 1
- 2
- 3
- 4
- 5
創建4個空容器,讓我們看看此時size和capacity的情況:
cout << "v1_size: " << v1.size() << "\t vl_capacity: " << v1.capacity()<<endl; cout << "v2_size: " << v2.size() << "\t v2_capacity: " << v2.capacity() << endl; cout << "v3_size: " << v3.size() << "\t v3_capacity: " << v3.capacity() << endl; cout << "v4_size: " << v4.size() << "\t v4_capacity: " << v4.capacity() << endl << endl;- 1
- 2
- 3
- 4
- 5
輸出結果為:
v1_size: 0 , vl_capacity: 0
v2_size: 0 , v2_capacity: 0
v3_size: 0 , v3_capacity: 0
v4_size: 0 , v4_capacity: 0
看來剛創建的空容器,size和capacity是一致的。
操作2
這里補充個很有意思的小實驗。我們給空容器v2添加一個元素,觀察此時的size和capacity
v2.push_back(99); cout << "v2_size: " << v2.size() << "\t v2_capacity: " << v2.capacity() << endl;- 1
- 2
- 3
結果:
v2_size: 1,v2_capacity: 1
哇!size和capacity同時加1了。此時size可以理解,因為當前v2中的元素個數為1。至于capacity,根據定義,capacity是不能小于size的。
這里size和capacity是相等的,但感覺怪怪的。下面繼續操作:
int nums = 20; for (int i = 0; i < nums; ++i){v2.push_back(i+1);cout << "v2_size: " << v2.size() << "\t v2_capacity: " << v2.capacity() << endl; }- 1
- 2
- 3
- 4
- 5
讓我們直接看結果:
v2_size: 2 , v2_capacity: 2
v2_size: 3 , v2_capacity: 3
v2_size: 4 , v2_capacity: 4
v2_size: 5 , v2_capacity: 6
v2_size: 6 , v2_capacity: 6
v2_size: 7 , v2_capacity: 9
v2_size: 8 , v2_capacity: 9
v2_size: 9 , v2_capacity: 9
v2_size: 10 , v2_capacity: 13
v2_size: 11 , v2_capacity: 13
v2_size: 12 , v2_capacity: 13
v2_size: 13 , v2_capacity: 13
v2_size: 14 , v2_capacity: 19
v2_size: 15 , v2_capacity: 19
v2_size: 16 , v2_capacity: 19
v2_size: 17 , v2_capacity: 19
v2_size: 18 , v2_capacity: 19
v2_size: 19 , v2_capacity: 19
v2_size: 20 , v2_capacity: 28
v2_size: 21 , v2_capacity: 28
看到輸出結果,是不是覺得很奇怪?咦,為什么有時候capacity就比size要大了呢?
這里我們不深入探討,只是告訴大家這么一個有意思的現象。其實也很好解釋,容器是線性表,內存空間是連續的,每次添加一個新元素,系統可能會自動分配額外的存儲空間。至于這個”可能”發生的頻率,額外的存儲空間有多大?這里就不贅述。
操作3
下面看真正涉及resize和reserve的代碼:
v1.resize(100); v2.resize(100); v2.push_back(99); // 添加一個元素v3.reserve(100); v4.reserve(100);- 1
- 2
- 3
- 4
- 5
- 6
上述代碼將v1和v2 resize到100,并且v2再新加一個元素;而將v3和v4都 reserve到100。
讓我們看一下輸出結果:
v1_size: 100 , vl_capacity: 100
v2_size: 101 , v2_capacity: 150
v3_size: 0 , v3_capacity: 100
v4_size: 0 , v4_capacity: 100
此時v1的size和capacity都為100,這符合resize的定義:既分配了空間,也創建了對象。這里的空間就是100,對象就是100個元素。猜猜這100個元素值是多少,比如v1[0]。默認初始化為0,即v1[0]=0。
v2比較有意思,因為比v1多加了一個元素,所以size為101,但其capacity居然是150。大家默認理解就行,畢竟是系統根據vector特性進行分配的存儲空間,我們方向使用就好。
v3和v4則一致,size為0,capacity為100。這符合reserve操作的定義:reserve()表示容器預留空間,但不是真正的創建對象。所以這里的size為0,當前容器里根本沒有元素。
操作4
v1.resize(200); v2.reserve(200); v3.reserve(200); v4.resize(200);cout << "v1_size: " << v1.size() << "\t vl_capacity: " << v1.capacity() << endl; cout << "v2_size: " << v2.size() << "\t v2_capacity: " << v2.capacity() << endl; cout << "v3_size: " << v3.size() << "\t v3_capacity: " << v3.capacity() << endl; cout << "v4_size: " << v4.size() << "\t v4_capacity: " << v4.capacity() << endl << endl;我們混用resize()和reserve()函數,看一下輸出結果:
v1_size: 200 , vl_capacity: 200
v2_size: 101 , v2_capacity: 200
v3_size: 0 , v3_capacity: 200
v4_size: 200 , v4_capacity: 200
這里比較有意思,我們重點分析一下:
v1的size和capacity都為200,符合resize()的作用:size和capacity都改變。
v2的size為101,capacity為200,符合reserve()的作用:不改變size,但改變capacity。
v3經過兩次reserve()后,size為0,capacity為200,同樣符合reserve()的作用。
v4先經過一次reserve(),此時size為0,capacity為200;再經過resize()后,size和capacity都為200。
上述操作應該就能深刻體會resize()和reserve()兩個函數的作用和異同了。
操作5
這里再繼續舉個有意思的情況:
v4.push_back(8);cout << "v4_size: " << v4.size() << "\t v4_capacity: " << v4.capacity() << endl << endl;輸出:
v4_size: 201 , v4_capacity: 300
在給v4添加新元素之前,v4的size和capacity都為200。我們給v4添加一個元素后,size為201,capacity卻已經變成300了。
可見系統給vector動態分配的存儲空間,真的難以捉摸。不過我們作為使用者,其實并不需要考慮這些問題。
代碼完整版
// Summary: C++ vector中的resize和reserve函數使用 // Author: Amusi // Date: 2018-07-18#include <iostream> #include <vector>using namespace std;int main(){vector<int> v1;vector<int> v2;vector<int> v3;vector<int> v4;cout << "v1_size: " << v1.size() << "\t vl_capacity: " << v1.capacity()<<endl;cout << "v2_size: " << v2.size() << "\t v2_capacity: " << v2.capacity() << endl;cout << "v3_size: " << v3.size() << "\t v3_capacity: " << v3.capacity() << endl; cout << "v4_size: " << v4.size() << "\t v4_capacity: " << v4.capacity() << endl << endl;v2.push_back(99);cout << "v2_size: " << v2.size() << "\t v2_capacity: " << v2.capacity() << endl;int nums = 20;for (int i = 0; i < nums; ++i){v2.push_back(i+1);cout << "v2_size: " << v2.size() << "\t v2_capacity: " << v2.capacity() << endl;}cout << endl;v1.resize(100);v2.resize(100);v2.push_back(99); // 添加一個元素v3.reserve(100);v4.reserve(100);cout << "v1_size: " << v1.size() << "\t vl_capacity: " << v1.capacity() << endl;cout << "v2_size: " << v2.size() << "\t v2_capacity: " << v2.capacity() << endl;cout << "v3_size: " << v3.size() << "\t v3_capacity: " << v3.capacity() << endl;cout << "v4_size: " << v4.size() << "\t v4_capacity: " << v4.capacity() << endl << endl;v1.resize(200);v2.reserve(200);v3.reserve(200);v4.resize(200);cout << "v1_size: " << v1.size() << "\t vl_capacity: " << v1.capacity() << endl;cout << "v2_size: " << v2.size() << "\t v2_capacity: " << v2.capacity() << endl;cout << "v3_size: " << v3.size() << "\t v3_capacity: " << v3.capacity() << endl;cout << "v4_size: " << v4.size() << "\t v4_capacity: " << v4.capacity() << endl << endl;v4.push_back(8);cout << "v1_size: " << v1.size() << "\t vl_capacity: " << v1.capacity() << endl;cout << "v2_size: " << v2.size() << "\t v2_capacity: " << v2.capacity() << endl;cout << "v3_size: " << v3.size() << "\t v3_capacity: " << v3.capacity() << endl;cout << "v4_size: " << v4.size() << "\t v4_capacity: " << v4.capacity() << endl << endl;return 0; }輸出結果:
總結
- size():返回vector中的元素個數
- capacity():返回vector能存儲元素的總數
- resize()操作:創建指定數量的的元素并指定vector的存儲空間
- reserve()操作:指定vector的元素總數
總結
以上是生活随笔為你收集整理的C++ vector中的resize,reserve,size和capacity函数讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++string中find_first
- 下一篇: linux下source命令使用详解