C++ vector中的resize,reserve,size和capacity函数讲解
前言
在介紹resize(),reserve(),size()和capacity()函數(shù)之前,先簡(jiǎn)單介紹一下c++中vector的概念。
vector:順序容器(可變大小數(shù)組)。支持快速隨機(jī)訪問(wèn)。在尾部之外的位置插入或刪除元素可能很慢。
既然vector是個(gè)容器,那么一定相關(guān)特性,如添加元素、刪除元素和查詢?nèi)萜鞔笮〉炔僮鳌1疚闹攸c(diǎn)介紹vector中的resize(),reserve(),size()和capacity()函數(shù)。
基本概念
capacity
指容器在分配新的存儲(chǔ)空間之前能存儲(chǔ)的元素總數(shù)。
size
指當(dāng)前容器所存儲(chǔ)的元素個(gè)數(shù)
注:capacity是容器可存儲(chǔ)的最大總數(shù),size是當(dāng)前容器存儲(chǔ)的個(gè)數(shù)。還不理解,看我畫的圖(畫風(fēng)雖怪,但言簡(jiǎn)意賅)。
既分配了空間,也創(chuàng)建了對(duì)象。
這里空間就是capacity,對(duì)象就是容器中的元素。
reserve()表示容器預(yù)留空間,但不是真正的創(chuàng)建對(duì)象,需要通過(guò)insert()或push_back()等操作創(chuàng)建對(duì)象。
其實(shí)size()和capacity()沒(méi)有更多需要介紹的地方,大家平時(shí)coding時(shí)直接調(diào)用即可。當(dāng)然size()的使用頻率相當(dāng)高,通常進(jìn)行遍歷操作時(shí),最外層的for循環(huán)的次數(shù)即為size()。
resize和reverse
區(qū)別
代碼實(shí)例
代碼解析
操作1
vector<int> v1; vector<int> v2; vector<int> v3; vector<int> v4;- 1
- 2
- 3
- 4
- 5
創(chuàng)建4個(gè)空容器,讓我們看看此時(shí)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
輸出結(jié)果為:
v1_size: 0 , vl_capacity: 0
v2_size: 0 , v2_capacity: 0
v3_size: 0 , v3_capacity: 0
v4_size: 0 , v4_capacity: 0
看來(lái)剛創(chuàng)建的空容器,size和capacity是一致的。
操作2
這里補(bǔ)充個(gè)很有意思的小實(shí)驗(yàn)。我們給空容器v2添加一個(gè)元素,觀察此時(shí)的size和capacity
v2.push_back(99); cout << "v2_size: " << v2.size() << "\t v2_capacity: " << v2.capacity() << endl;- 1
- 2
- 3
結(jié)果:
v2_size: 1,v2_capacity: 1
哇!size和capacity同時(shí)加1了。此時(shí)size可以理解,因?yàn)楫?dāng)前v2中的元素個(gè)數(shù)為1。至于capacity,根據(jù)定義,capacity是不能小于size的。
這里size和capacity是相等的,但感覺(jué)怪怪的。下面繼續(xù)操作:
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
讓我們直接看結(jié)果:
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
看到輸出結(jié)果,是不是覺(jué)得很奇怪?咦,為什么有時(shí)候capacity就比size要大了呢?
這里我們不深入探討,只是告訴大家這么一個(gè)有意思的現(xiàn)象。其實(shí)也很好解釋,容器是線性表,內(nèi)存空間是連續(xù)的,每次添加一個(gè)新元素,系統(tǒng)可能會(huì)自動(dòng)分配額外的存儲(chǔ)空間。至于這個(gè)”可能”發(fā)生的頻率,額外的存儲(chǔ)空間有多大?這里就不贅述。
操作3
下面看真正涉及resize和reserve的代碼:
v1.resize(100); v2.resize(100); v2.push_back(99); // 添加一個(gè)元素v3.reserve(100); v4.reserve(100);- 1
- 2
- 3
- 4
- 5
- 6
上述代碼將v1和v2 resize到100,并且v2再新加一個(gè)元素;而將v3和v4都 reserve到100。
讓我們看一下輸出結(jié)果:
v1_size: 100 , vl_capacity: 100
v2_size: 101 , v2_capacity: 150
v3_size: 0 , v3_capacity: 100
v4_size: 0 , v4_capacity: 100
此時(shí)v1的size和capacity都為100,這符合resize的定義:既分配了空間,也創(chuàng)建了對(duì)象。這里的空間就是100,對(duì)象就是100個(gè)元素。猜猜這100個(gè)元素值是多少,比如v1[0]。默認(rèn)初始化為0,即v1[0]=0。
v2比較有意思,因?yàn)楸葀1多加了一個(gè)元素,所以size為101,但其capacity居然是150。大家默認(rèn)理解就行,畢竟是系統(tǒng)根據(jù)vector特性進(jìn)行分配的存儲(chǔ)空間,我們方向使用就好。
v3和v4則一致,size為0,capacity為100。這符合reserve操作的定義:reserve()表示容器預(yù)留空間,但不是真正的創(chuàng)建對(duì)象。所以這里的size為0,當(dāng)前容器里根本沒(méi)有元素。
操作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()函數(shù),看一下輸出結(jié)果:
v1_size: 200 , vl_capacity: 200
v2_size: 101 , v2_capacity: 200
v3_size: 0 , v3_capacity: 200
v4_size: 200 , v4_capacity: 200
這里比較有意思,我們重點(diǎn)分析一下:
v1的size和capacity都為200,符合resize()的作用:size和capacity都改變。
v2的size為101,capacity為200,符合reserve()的作用:不改變size,但改變capacity。
v3經(jīng)過(guò)兩次reserve()后,size為0,capacity為200,同樣符合reserve()的作用。
v4先經(jīng)過(guò)一次reserve(),此時(shí)size為0,capacity為200;再經(jīng)過(guò)resize()后,size和capacity都為200。
上述操作應(yīng)該就能深刻體會(huì)resize()和reserve()兩個(gè)函數(shù)的作用和異同了。
操作5
這里再繼續(xù)舉個(gè)有意思的情況:
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添加一個(gè)元素后,size為201,capacity卻已經(jīng)變成300了。
可見系統(tǒng)給vector動(dòng)態(tài)分配的存儲(chǔ)空間,真的難以捉摸。不過(guò)我們作為使用者,其實(shí)并不需要考慮這些問(wèn)題。
代碼完整版
// Summary: C++ vector中的resize和reserve函數(shù)使用 // 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); // 添加一個(gè)元素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; }輸出結(jié)果:
總結(jié)
- size():返回vector中的元素個(gè)數(shù)
- capacity():返回vector能存儲(chǔ)元素的總數(shù)
- resize()操作:創(chuàng)建指定數(shù)量的的元素并指定vector的存儲(chǔ)空間
- reserve()操作:指定vector的元素總數(shù)
總結(jié)
以上是生活随笔為你收集整理的C++ vector中的resize,reserve,size和capacity函数讲解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++string中find_first
- 下一篇: s3c2440移植MQTT