最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++ STL vector容量(capacity)和大小(size)的區(qū)別

 更新時(shí)間:2021年05月01日 10:15:01   投稿:zx  
這篇文章主要介紹了詳解C++ STL vector容量(capacity)和大小(size)的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

很多初學(xué)者分不清楚 vector 容器的容量(capacity)和大小(size)之間的區(qū)別,甚至有人認(rèn)為它們表達(dá)的是一個(gè)意思。本節(jié)將對(duì) vector 容量和大小各自的含義做一個(gè)詳細(xì)的介紹。

vector 容器的容量(用 capacity 表示),指的是在不分配更多內(nèi)存的情況下,容器可以保存的最多元素個(gè)數(shù);而 vector 容器的大?。ㄓ?size 表示),指的是它實(shí)際所包含的元素個(gè)數(shù)。

對(duì)于一個(gè) vector 對(duì)象來(lái)說(shuō),通過(guò)該模板類(lèi)提供的 capacity() 成員函數(shù),可以獲得當(dāng)前容器的容量;通過(guò) size() 成員函數(shù),可以獲得容器當(dāng)前的大小。例如:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    std::vector<int>value{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 };
    value.reserve(20);
    cout << "value 容量是:" << value.capacity() << endl;
    cout << "value 大小是:" << value.size() << endl;
    return 0;
}

程序輸出結(jié)果為:

value 容量是:20
value 大小是:15

結(jié)合該程序的輸出結(jié)果,圖 1 可以更好的說(shuō)明 vector 容器容量和大小之間的關(guān)系。

圖 1 vector 容量和大小的區(qū)別

顯然,vector 容器的大小不能超出它的容量,在大小等于容量的基礎(chǔ)上,只要增加一個(gè)元素,就必須分配更多的內(nèi)存。注意,這里的“更多”并不是 1 個(gè)。換句話(huà)說(shuō),當(dāng) vector 容器的大小和容量相等時(shí),如果再向其添加(或者插入)一個(gè)元素,vector 往往會(huì)申請(qǐng)多個(gè)存儲(chǔ)空間,而不僅僅只申請(qǐng) 1 個(gè)。

一旦 vector 容器的內(nèi)存被重新分配,則和 vector 容器中元素相關(guān)的所有引用、指針以及迭代器,都可能會(huì)失效,最穩(wěn)妥的方法就是重新生成。

舉個(gè)例子:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int>value{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 };
    cout << "value 容量是:" << value.capacity() << endl;
    cout << "value 大小是:" << value.size() << endl;
    printf("value首地址:%p\n", value.data());
    value.push_back(53);
    cout << "value 容量是(2):" << value.capacity() << endl;
    cout << "value 大小是(2):" << value.size() << endl;
    printf("value首地址: %p", value.data());
    return 0;
}

運(yùn)行結(jié)果為:

value 容量是:15
value 大小是:15
value首地址:01254D40
value 容量是(2):22
value 大小是(2):16
value首地址: 01254E80

可以看到,向“已滿(mǎn)”的 vector 容器再添加一個(gè)元素,整個(gè) value 容器的存儲(chǔ)位置發(fā)生了改變,同時(shí) vector 會(huì)一次性申請(qǐng)多個(gè)存儲(chǔ)空間(具體多少,取決于底層算法的實(shí)現(xiàn))。這樣做的好處是,可以很大程度上減少 vector 申請(qǐng)空間的次數(shù),當(dāng)后續(xù)再添加元素時(shí),就可以節(jié)省申請(qǐng)空間耗費(fèi)的時(shí)間。

因此,對(duì)于 vector 容器而言,當(dāng)增加新的元素時(shí),有可能很快完成(即直接存在預(yù)留空間中);也有可能會(huì)慢一些(擴(kuò)容之后再放新元素)。

修改vector容器的容量和大小

另外,通過(guò)前面的學(xué)習(xí)我們知道,可以調(diào)用 reserve() 成員函數(shù)來(lái)增加容器的容量(但并不會(huì)改變存儲(chǔ)元素的個(gè)數(shù));而通過(guò)調(diào)用成員函數(shù) resize() 可以改變?nèi)萜鞯拇笮?,并且該函?shù)也可能會(huì)導(dǎo)致 vector 容器容量的增加。比如說(shuō):

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int>value{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 };
    cout << "value 容量是:" << value.capacity() << endl;
    cout << "value 大小是:" << value.size() << endl;
    value.reserve(20);
    cout << "value 容量是(2):" << value.capacity() << endl;
    cout << "value 大小是(2):" << value.size() << endl;
    //將元素個(gè)數(shù)改變?yōu)?21 個(gè),所以會(huì)增加 6 個(gè)默認(rèn)初始化的元素
    value.resize(21);
    //將元素個(gè)數(shù)改變?yōu)?21 個(gè),新增加的 6 個(gè)元素默認(rèn)值為 99。
    //value.resize(21,99);
    //當(dāng)需要減小容器的大小時(shí),會(huì)移除多余的元素。
    //value.resize(20);
    cout << "value 容量是(3):" << value.capacity() << endl;
    cout << "value 大小是(3):" << value.size() << endl;
    return 0;
}

運(yùn)行結(jié)果為:

value 容量是:15
value 大小是:15
value 容量是(2):20
value 大小是(2):15
value 容量是(3):30
value 大小是(3):21

程序中給出了關(guān)于 resize() 成員函數(shù)的 3 種不同的用法,有興趣的讀者可自行查看不同用法的運(yùn)行結(jié)果。

可以看到,僅通過(guò) reserve() 成員函數(shù)增加 value 容器的容量,其大小并沒(méi)有改變;但通過(guò) resize() 成員函數(shù)改變 value 容器的大小,它的容量可能會(huì)發(fā)生改變。另外需要注意的是,通過(guò) resize() 成員函數(shù)減少容器的大?。ǘ嘤嗟脑貢?huì)直接被刪除),不會(huì)影響容器的容量。

vector容器容量和大小的數(shù)據(jù)類(lèi)型

在實(shí)際場(chǎng)景中,我們可能需要將容器的容量和大小保存在變量中,要知道 vector<T> 對(duì)象的容量和大小類(lèi)型都是 vector<T>::size_type 類(lèi)型。因此,當(dāng)定義一個(gè)變量去保存這些值時(shí),可以如下所示:

vector<int>::size_type cap = value.capacity();
vector<int>::size_type size = value.size();

size_type 類(lèi)型是定義在由 vector 類(lèi)模板生成的 vecotr 類(lèi)中的,它表示的真實(shí)類(lèi)型和操作系統(tǒng)有關(guān),在 32 位架構(gòu)下普遍表示的是 unsigned int 類(lèi)型,而在 64 位架構(gòu)下普通表示 unsigned long 類(lèi)型。

當(dāng)然,我們還可以使用 auto 關(guān)鍵字代替 vector<int>::size_type,比如:

auto cap = value.capacity();
auto size = value.size();

到此這篇關(guān)于詳解C++ STL vector容量(capacity)和大小(size)的區(qū)別的文章就介紹到這了,更多相關(guān)C++ STL vector容量和大小內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++內(nèi)存模型和名稱(chēng)空間詳解

    C++內(nèi)存模型和名稱(chēng)空間詳解

    這篇文章主要給大家介紹了關(guān)于C/C++中的內(nèi)存模型和名稱(chēng)空間詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c/c++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧
    2021-09-09
  • C語(yǔ)言中strcpy和strcat的使用和模擬實(shí)現(xiàn)

    C語(yǔ)言中strcpy和strcat的使用和模擬實(shí)現(xiàn)

    strcpy()?函數(shù)是?C語(yǔ)言中一個(gè)非常重要的字符串處理函數(shù),其功能是將一個(gè)字符串復(fù)制到另一個(gè)字符串中,strcat函數(shù)可以將一個(gè)字符串拼接到另一個(gè)字符串的末尾,本文給大家介紹了C語(yǔ)言中strcpy和strcat的使用和模擬實(shí)現(xiàn),需要的朋友可以參考下
    2024-03-03
  • C語(yǔ)言 位運(yùn)算詳解及示例代碼

    C語(yǔ)言 位運(yùn)算詳解及示例代碼

    本文主要介紹C語(yǔ)言 位運(yùn)算的基礎(chǔ)知識(shí),這里整理了相關(guān)資料及示例代碼,有興趣的小伙伴可以參考下
    2016-08-08
  • C語(yǔ)言實(shí)現(xiàn)三子棋(井字棋)算法

    C語(yǔ)言實(shí)現(xiàn)三子棋(井字棋)算法

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)三子棋(井字棋)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 數(shù)據(jù)結(jié)構(gòu)之AVL樹(shù)詳解

    數(shù)據(jù)結(jié)構(gòu)之AVL樹(shù)詳解

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之AVL樹(shù)詳解,本文非常細(xì)致的講解了AVL樹(shù)的基礎(chǔ)知識(shí)、AVL樹(shù)的旋轉(zhuǎn)操作、AVL數(shù)的插入和刪除操作等,需要的朋友可以參考下
    2014-08-08
  • MFC實(shí)現(xiàn)連連看游戲之消子算法

    MFC實(shí)現(xiàn)連連看游戲之消子算法

    這篇文章主要為大家詳細(xì)介紹了MFC實(shí)現(xiàn)連連看游戲之消子算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲

    基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 用C語(yǔ)言實(shí)現(xiàn)計(jì)算器功能

    用C語(yǔ)言實(shí)現(xiàn)計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++實(shí)現(xiàn)截圖截屏的示例代碼

    C++實(shí)現(xiàn)截圖截屏的示例代碼

    本文主要介紹了C++實(shí)現(xiàn)截圖截屏的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C++??STL?_?Vector使用及模擬實(shí)現(xiàn)

    C++??STL?_?Vector使用及模擬實(shí)現(xiàn)

    這篇文章主要介紹了C++ STL_Vector使用及模擬實(shí)現(xiàn),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08

最新評(píng)論

高雄市| 盐津县| 惠州市| 武强县| 扶绥县| 昌黎县| 巢湖市| 博兴县| 临沧市| 荥经县| 晋宁县| 九寨沟县| 武乡县| 桦南县| 玉环县| 乌拉特中旗| 军事| 西畴县| 济源市| 西华县| 安乡县| 宁远县| 香港 | 泾阳县| 竹北市| 海口市| 东海县| 焉耆| 从江县| 吉首市| 延庆县| 青川县| 沁源县| 项城市| 汶川县| 二手房| 西峡县| 互助| 惠来县| 图们市| 万山特区|