日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++ vector中的resize,reserve,size和capacity函数讲解

發(fā)布時(shí)間:2024/4/18 c/c++ 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ vector中的resize,reserve,size和capacity函数讲解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

在介紹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)意賅)。

  • resize
  • 既分配了空間,也創(chuàng)建了對(duì)象。

    這里空間就是capacity,對(duì)象就是容器中的元素。

  • reserve
  • 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ū)別

  • reserve()只修改capacity大小,不修改size大小,
  • resize()既修改capacity大小,也修改size大小。
  • 代碼實(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。