国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vector VS deque

這篇具有很好參考價(jià)值的文章主要介紹了vector VS deque。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. vector與deque

vector與動(dòng)態(tài)數(shù)組相同,能夠在插入或刪除元素時(shí)自動(dòng)調(diào)整自身大小,其存儲(chǔ)由容器自動(dòng)處理,vector通常占用多于靜態(tài)數(shù)組的空間,因?yàn)橐峙涓嗟膬?nèi)存以管理將來的增長(zhǎng),在每次插入元素的時(shí),僅當(dāng)額外內(nèi)存耗盡時(shí)觸發(fā)重新分配。

vector VS deque,C++,c++,vector,deque

如上圖所示,vector元素放置在連續(xù)存儲(chǔ)中,以便可以使用迭代器訪問和遍歷他們。在vector中,末尾插入需要不同的時(shí)間,因?yàn)橛袝r(shí)候需要擴(kuò)展存儲(chǔ)空間。對(duì)于刪除最后一個(gè)元素,因?yàn)椴簧婕按鎯?chǔ)空間大小的調(diào)整,則執(zhí)行時(shí)間是恒定的。對(duì)于開頭或者中間插入和擦除在時(shí)間上是線性的,因?yàn)榭赡芤婕暗皆氐囊苿?dòng)。

deque是具有兩端擴(kuò)縮功能的序列容器。其存儲(chǔ)方式與vector相反,deque的元素不是相接存儲(chǔ)的,是由一段一段等長(zhǎng)的連續(xù)空間構(gòu)成的,各段之間并不一定是連續(xù)的。它的典型實(shí)現(xiàn)如下圖所示,通過單獨(dú)分配固定尺寸的序列(對(duì)應(yīng)圖中的數(shù)據(jù)區(qū)),外加額外的登記(對(duì)應(yīng)圖中map映射區(qū)),map數(shù)組中存儲(chǔ)的是每段連續(xù)空間的地址,通過映射區(qū)來管理這些一段一段等長(zhǎng)的連續(xù)空間,進(jìn)而實(shí)現(xiàn)“整體連續(xù)”的效果。

vector VS deque,C++,c++,vector,deque

當(dāng)deque容器需要在頭部或者尾部增加空間的時(shí)候,它會(huì)申請(qǐng)一段新的連續(xù)空間,同時(shí)在map數(shù)組的開頭或者結(jié)尾添加指向該空間的指針,由此將deque元素串接起來。在遇到空間不足的時(shí)候由于deque可以申請(qǐng)新的連續(xù)空間,原數(shù)據(jù)空間可以保持不變,更新map即可,所以deque在涉及到空間擴(kuò)展的時(shí)候,效率遠(yuǎn)高于vector。

2. 性能比較

2.1 隨機(jī)訪問

vector VS deque,C++,c++,vector,deque

由于vector是連續(xù)存儲(chǔ)的,deque是分段連續(xù)存儲(chǔ),其隨機(jī)訪問需對(duì)map數(shù)組進(jìn)行二次指針解引用(可以理解為:deque隨機(jī)訪問需要先去找到待訪問元素在哪段連續(xù)存儲(chǔ)空間,然后再對(duì)該空間進(jìn)行下標(biāo)訪問),而vector只有下標(biāo)訪問一次即可。因此在隨機(jī)訪問性能上,vector略高于deque,但兩者復(fù)雜度均為常數(shù) O ( 1 ) O(1) O(1)。

2.2 末尾插入/刪除

vector VS deque,C++,c++,vector,deque

前面我們說過,vector的存儲(chǔ)是自動(dòng)管理的,按需擴(kuò)張收縮,vector通常占用多于靜態(tài)數(shù)組的空間,因?yàn)橐峙涓嗟膬?nèi)存以管理將來的增長(zhǎng),通常情況下vector在尾部插入元素的復(fù)雜度為 O ( 1 ) O(1) O(1),但當(dāng)額外內(nèi)存耗盡的時(shí)候,需要重新分配,此時(shí)重新分配,是需要單獨(dú)再申請(qǐng)一份更大空間,把vector原有的元素重新放到新申請(qǐng)的空間上,再完成尾部插入,此時(shí)涉及到了新空間的申請(qǐng)、所有元素的移動(dòng)和舊空間的釋放,這種情況下的插入在性能上是災(zāi)難級(jí)別的,因此,總的來說對(duì)于vector尾部插入的時(shí)間復(fù)雜度為均攤常數(shù) O ( 1 ) O(1) O(1)。

對(duì)于deque由于存儲(chǔ)空間是分段連續(xù)的,當(dāng)空間不夠的時(shí)候重新申請(qǐng)新的一段空間即可,不會(huì)涉及到舊元素的移動(dòng),其復(fù)雜度度為常數(shù) O ( 1 ) O(1) O(1)。對(duì)于尾部刪除,因?yàn)椴簧婕暗椒峙淇臻g申請(qǐng),因此兩者的復(fù)雜度均在 O ( 1 ) O(1) O(1)

vector在尾部插入元素的時(shí),新的size()如果大于capacity(),那么所有的迭代器和引用(包括end()迭代器)都會(huì)失效,否則只有end()迭代器會(huì)失效。而deque除了迭代器會(huì)失效,而不會(huì)使指向其余元素的指針或引用失效。

2.3 隨機(jī)插入/刪除

vector VS deque,C++,c++,vector,deque

vector在進(jìn)行隨機(jī)插入的時(shí)候,涉及到插入位置到序列尾部這段元素的移動(dòng)(可以理解為這段元素需要整體往后移動(dòng)一位,給新插入元素把位置留出來),隨機(jī)刪除元素同理,因此其隨機(jī)插入/刪除的時(shí)間復(fù)雜度為插入位置與到vector尾部距離成線性 O ( n ) O(n) O(n)。deque的擴(kuò)展方式是雙向的,因此其可以**根據(jù)插入位置距離頭部或者尾部較近的距離成線性 O ( n ) O(n) O(n),**因此,其性能略勝vector一丟丟。

:對(duì)于vector隨機(jī)插入,如果新size()大于舊的capacity()就會(huì)導(dǎo)致重分配,所有的迭代器和引用都會(huì)失效,否則,只有在插入點(diǎn)前的迭代器和引用會(huì)保持有效。對(duì)于deque而言,所有迭代器和引用也會(huì)失效,除非插入位置為容器尾部或者頭部,引用不會(huì)失效。

3. 總結(jié)

vectordeque的對(duì)比如下表所示:

vector deque
頭文件 使用需要包含頭文件<vector> 使用需要包含頭文件<deque>
存儲(chǔ)方式 連續(xù)存儲(chǔ)元素 包含元素連續(xù)存儲(chǔ)的內(nèi)存快列表
隨機(jī)訪問 支持,復(fù)雜度為常數(shù) O ( 1 ) O(1) O(1) 支持,復(fù)雜度為常數(shù) O ( 1 ) O(1) O(1)
末尾插入/末尾刪除元素 均攤常數(shù) O ( 1 ) O(1) O(1) 常數(shù) O ( 1 ) O(1) O(1)
隨機(jī)插入/隨機(jī)刪除元素 與到vector結(jié)尾的距離成線性 O ( n ) O(n) O(n) 線性 O ( n ) O(n) O(n)

vector重分配在性能上是有開銷的,如果在使用之前元素的數(shù)量已知,那么可以使用rederve()函數(shù)來消除重分配。

deque的存儲(chǔ)按需自動(dòng)擴(kuò)展及收縮,擴(kuò)展deque比擴(kuò)張vector更優(yōu),因?yàn)樗簧婕暗綇?fù)制既存元素到新內(nèi)存位置。但另外一方面,deque典型地?fù)碛休^大的最小內(nèi)存開銷,所以當(dāng)即使保有一個(gè)元素的時(shí)候,deque也需要為它分配它的整個(gè)內(nèi)部數(shù)組。

文章首發(fā)公眾號(hào):iDoitnow如果喜歡話,可以關(guān)注一下文章來源地址http://www.zghlxwxcb.cn/news/detail-676028.html

到了這里,關(guān)于vector VS deque的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++中vector、list和deque的選擇:什么時(shí)候使用它們?

    C++中vector、list和deque的選擇:什么時(shí)候使用它們?

    前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站,這篇文章男女通用,看懂了就去分享給你的碼吧。 在C++中,vector、list和deque是STL(標(biāo)準(zhǔn)模板庫)提供的三種常見的容器。每種容器都有其特點(diǎn)和適用場(chǎng)景。本文將詳

    2024年02月13日
    瀏覽(20)
  • deque用法深度解析,一篇文章弄懂deque容器各種操作

    deque用法深度解析,一篇文章弄懂deque容器各種操作

    ?? 博客主頁:在下馬農(nóng)的碎碎念 ? 本文由在下馬農(nóng)原創(chuàng),首發(fā)于CSDN ?? 首發(fā)時(shí)間:2022/01/11 ?? 最近更新時(shí)間:2022/01/11 ?? 此馬非凡馬,房星本是星。向前敲瘦骨,猶自帶銅聲。 ?? 系列文章目錄: 暫無 ??作者水平有限,如發(fā)現(xiàn)錯(cuò)誤,請(qǐng)留言轟炸哦!萬分感謝! ??碼字不

    2023年04月24日
    瀏覽(22)
  • deque(簡(jiǎn)單介紹一下)

    deque(簡(jiǎn)單介紹一下)

    deque的基本情況: 簡(jiǎn)單的來說deque是一個(gè)雙頭隊(duì)列。且兩邊的尺寸可以動(dòng)態(tài)收縮或者擴(kuò)張。 其底層實(shí)現(xiàn)相當(dāng)復(fù)雜,而且效率并不高。大多數(shù)時(shí)候都不會(huì)使用。 deque誕生的原因是vector和list的優(yōu)缺點(diǎn)不可分割。 正好復(fù)習(xí)一下vector和list的優(yōu)缺點(diǎn)。 vector的優(yōu)點(diǎn):支持隨機(jī)訪問;尾插

    2024年02月08日
    瀏覽(22)
  • 【C++】deque的用法

    【C++】deque的用法

    在了解deque前,我們先講一講什么是適配器。 適配器是一種設(shè)計(jì)模式 (設(shè)計(jì)模式是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)), 該種模式是將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。 就像我們生活中常見的充電器一樣。 在STL中,雖然

    2024年02月08日
    瀏覽(20)
  • C++ deque底層原理

    C++ deque底層原理

    實(shí)現(xiàn)雙端數(shù)組 雙向開口的連續(xù)線性空間 class deque : protected Deque base _Deque_base._Deque_impl _Deque_iterator _deque buf size 連續(xù)空間中能容納元素的個(gè)數(shù) _M_initialize _map 當(dāng)前連續(xù)空間夠不夠 map 空間夠不夠 刪除最后一個(gè)節(jié)點(diǎn),如果當(dāng)前連續(xù)空間沒有數(shù)據(jù)了,則釋放該連續(xù)空間 推薦一個(gè)零聲

    2024年02月10日
    瀏覽(11)
  • 第十一章:deque類

    第十一章:deque類

    deque是一種雙開口的“連續(xù)空間”的容器。 deque(雙端隊(duì)列):是一種雙開口的\\\"連續(xù)\\\"空間的數(shù)據(jù)結(jié)構(gòu),雙開口的含義是:可以在頭尾兩端進(jìn)行插入和刪除操作,且時(shí)間復(fù)雜度為O(1),與vector比較,頭插效率高,不需要搬移元素;與list比較,空間利用率比較高 。 deque并不是真正連

    2024年02月15日
    瀏覽(26)
  • Python:【基礎(chǔ)語法】 deque()用法

    Python中的標(biāo)準(zhǔn)庫collections中有一個(gè)deque,該對(duì)象與list列表相似。這里的“雙向”指的是deuqe的結(jié)構(gòu)使用雙向鏈表,它提供了兩端都可以操作的序列,這意味著,我們可以在序列前后都執(zhí)行添加或刪除。大多操作與List相同,如訪問元素,求序列長(zhǎng)度等,同樣deque序列中的元素類型

    2023年04月13日
    瀏覽(20)
  • Queue,List,Deque聯(lián)系

    Queue,List,Deque聯(lián)系

    如圖所示,可以得出 LinkedList既可以是雙向鏈表也可以是雙端隊(duì)列,Deque接口繼承了Queue接口 Queue add(E):boolean 在隊(duì)尾添加元素,添加成功返回true,如果 隊(duì)列已滿 無法添加則 拋出異常。 offer(E):boolean 在隊(duì)尾添加元素,添加成功返回true,如果 隊(duì)列已滿 無法添加則 返回false 。

    2024年02月11日
    瀏覽(16)
  • 雙端隊(duì)列deque(C++)

    栗醬有一天在網(wǎng)上沖浪的時(shí)候發(fā)現(xiàn)了一道很有意思的數(shù)據(jù)結(jié)構(gòu)題。 該數(shù)據(jù)結(jié)構(gòu)形如長(zhǎng)條形。 一開始該容器為空,有以下七種操作。 1 a從前面插入元素a 2 從前面刪除一個(gè)元素 3 a從后面插入一個(gè)元素 4 從后面刪除一個(gè)元素 5 將整個(gè)容器頭尾翻轉(zhuǎn) 6 輸出個(gè)數(shù)和所有元素 7 對(duì)所有

    2024年02月11日
    瀏覽(20)
  • 淺談deque,queue,stack

    deque 和 queue 都是常用于存儲(chǔ)元素的容器,但它們?cè)跀?shù)據(jù)結(jié)構(gòu)和應(yīng)用場(chǎng)景上有一些區(qū)別。 queue 是隊(duì)列的一種實(shí)現(xiàn),它只能從隊(duì)首插入元素,而只能從隊(duì)尾獲取并移除元素。即,queue 滿足 FIFO(先進(jìn)先出)的特性。queue 通常用于實(shí)現(xiàn)任務(wù)隊(duì)列、消息隊(duì)列等場(chǎng)景。 deque 則是雙端隊(duì)

    2024年02月07日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包