deque与vector的主要区别
deque與vector非常相似。它也采用動(dòng)態(tài)數(shù)組管理元素,提供隨機(jī)存取,有著和vector幾乎一樣的接口。不同的是deque的動(dòng)態(tài)數(shù)組頭尾都開(kāi)放,因此能在頭尾兩端進(jìn)行快速安插和刪除。
deque通常實(shí)作為一組獨(dú)立區(qū)塊,第一區(qū)塊朝某方向擴(kuò)展,最后一個(gè)區(qū)塊朝另一個(gè)方向擴(kuò)展。
deque與vector的主要不同之處在于:
1. 兩端都能快速安插和刪除元素,這些操作可以在分期攤還的常數(shù)時(shí)間(amortized constant time)內(nèi)完成。
2. 元素的存取和迭代器的動(dòng)作比vector稍慢。
3. 迭代器需要在不同區(qū)塊間跳轉(zhuǎn),所以它非一般指針。
4. 因?yàn)閐eque使用不止一塊內(nèi)存(而vector必須使用一塊連續(xù)內(nèi)存),所以deque的max_size()可能更大。
5. 不支持對(duì)容量和內(nèi)存重新分配時(shí)機(jī)的控制。不過(guò)deque的內(nèi)存重分配優(yōu)于vector,因?yàn)槠鋬?nèi)部結(jié)構(gòu)顯示,deque不必在內(nèi)存重分配時(shí)復(fù)制所有元素。
6. 除了頭尾兩端,在任何地方安插或刪除元素,都將導(dǎo)致指向deque元素的所有pointers、references、iterators失效。
7. deque的內(nèi)存區(qū)塊不再被使用時(shí),會(huì)自動(dòng)被釋放。deque的內(nèi)存大小是可自動(dòng)縮減的。
8. deque與vector組織內(nèi)存的方式不一樣。在底層,deque按“頁(yè)”(page)或“塊”(chunk)來(lái)分配存儲(chǔ)器,每頁(yè)包含固定數(shù)目的元素。而vector只分配一塊連續(xù)的內(nèi)存。例如,一個(gè)10M字節(jié)的vector使用的是一整塊10M字節(jié)的內(nèi)存,而deque可以使用一串更小的內(nèi)存塊,比如10塊1M的內(nèi)存。所以不能將deque的地址(如&deque[0])傳遞給傳統(tǒng)的C API,因?yàn)閐eque內(nèi)部所使用的內(nèi)存不一定會(huì)連續(xù)。
deque的下述特性與vector差不多:
1. 在中部安插、刪除元素的速度較慢。
2. 迭代器屬于random access iterator(隨機(jī)存取迭代器)。
優(yōu)先使用vector,還是deque?
c++標(biāo)準(zhǔn)建議:vector是那種應(yīng)該在默認(rèn)情況下使用的序列。如果大多數(shù)插入和刪除操作發(fā)生在序列的頭部或尾部時(shí),應(yīng)該選用deque。
使用deque還需注意:
1. 除了at(),其它成員函數(shù)均不會(huì)檢查索引或迭代器是否有效。
2. 任何插入或刪除動(dòng)作都會(huì)使所有指向deque元素的pointers、references、iteartors失效,唯一例外的是在頭部或尾部插入元素(此時(shí)pointers和references仍然有效,但iterators失效)。
總結(jié)
以上是生活随笔為你收集整理的deque与vector的主要区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Boost】boost库asio详解2
- 下一篇: linux 启动后台服务 nohup