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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發布時間:2024/4/18 c/c++ 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ vector中的resize,reserve,size和capacity函数讲解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在介紹resize(),reserve(),size()和capacity()函數之前,先簡單介紹一下c++中vector的概念。

vector:順序容器(可變大小數組)。支持快速隨機訪問。在尾部之外的位置插入或刪除元素可能很慢。

既然vector是個容器,那么一定相關特性,如添加元素、刪除元素和查詢容器大小等操作。本文重點介紹vector中的resize(),reserve(),size()和capacity()函數。

基本概念

  • capacity

    指容器在分配新的存儲空間之前能存儲的元素總數。

  • size

    指當前容器所存儲的元素個數

  • 注:capacity是容器可存儲的最大總數,size是當前容器存儲的個數。還不理解,看我畫的圖(畫風雖怪,但言簡意賅)。

  • resize
  • 既分配了空間,也創建了對象。

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

  • reserve
  • reserve()表示容器預留空間,但不是真正的創建對象,需要通過insert()或push_back()等操作創建對象。

    其實size()和capacity()沒有更多需要介紹的地方,大家平時coding時直接調用即可。當然size()的使用頻率相當高,通常進行遍歷操作時,最外層的for循環的次數即為size()。

    resize和reverse

    區別

  • reserve()只修改capacity大小,不修改size大小,
  • resize()既修改capacity大小,也修改size大小。
  • 代碼實例

    代碼解析

    操作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函数讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。