Qt工作笔记-QList (链表) QVector (数组)【转载】
原文地址:https://blog.csdn.net/qq_33266987/article/details/53333373
C++中的list 和 vector
(1)、
stl提供了三個(gè)最基本的容器:vector,list,deque。
vector和built-in數(shù)組類似,它擁有一段連續(xù)的內(nèi)存空間,并且起始地址不變,因此它能非常好的支持隨即存取,即?[]操作符,但由于它的內(nèi)存空間是連續(xù)的,所以在中間進(jìn)行插入和刪除會(huì)造成內(nèi)存塊的拷貝,另外,當(dāng)該數(shù)組后的內(nèi)存空間不夠時(shí),需要重新申請(qǐng)一塊足夠大的內(nèi)存并進(jìn)行內(nèi)存的拷貝。這些都大大影響了vector的效率。
list就是數(shù)據(jù)結(jié)構(gòu)中的雙向鏈表(根據(jù)sgi stl源代碼),因此它的內(nèi)存空間可以是不連續(xù)的,通過指針來進(jìn)行數(shù)據(jù)的訪問,這個(gè)特點(diǎn)使得它的隨即存取變的非常沒有效率,因此它沒有提供[]?操作符的重載。但由于鏈表的特點(diǎn),它可以以很好的效率支持任意地方的刪除和插入。
deque是一個(gè)double-ended queue,它的具體實(shí)現(xiàn)不太清楚,但知道它具有以下兩個(gè)特點(diǎn):
它支持[]操作符,也就是支持隨即存取,并且和vector的效率相差無幾,它支持在兩端的操作:push_back,push_front,pop_back,pop_front等,并且在兩端操作上與list的效率也差不多。
因此在實(shí)際使用時(shí),如何選擇這三個(gè)容器中哪一個(gè),應(yīng)根據(jù)你的需要而定,一般應(yīng)遵循下面
的原則:
? 1、如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector
? 2、如果你需要大量的插入和刪除,而不關(guān)心隨即存取,則應(yīng)使用list
? 3、如果你需要隨即存取,而且關(guān)心兩端數(shù)據(jù)的插入和刪除,則應(yīng)使用deque。
(2)、
vector為存儲(chǔ)的對(duì)象分配一塊連續(xù)的地址空間,因此對(duì)vector中的元素隨機(jī)訪問效率很高。在vecotor中插入或者刪除某個(gè)元素,需要將現(xiàn)有元素進(jìn)行復(fù)制,移動(dòng)。如果vector中存儲(chǔ)的對(duì)象很大,或者構(gòu)造函數(shù)復(fù)雜,則在對(duì)現(xiàn)有元素進(jìn)行拷貝時(shí)開銷較大,因?yàn)榭截悓?duì)象要調(diào)用拷貝構(gòu)造函數(shù)。對(duì)于簡(jiǎn)單的小對(duì)象,vector的效率優(yōu)于list。vector在每次擴(kuò)張容量的時(shí)候,將容量擴(kuò)展2倍,這樣對(duì)于小對(duì)象來說,效率是很高的。
list中的對(duì)象是離散存儲(chǔ)的,隨機(jī)訪問某個(gè)元素需要遍歷list。在list中插入元素,尤其是在首尾插入元素,效率很高,只需要改變?cè)氐闹羔槨?/span>
綜上所述:
vector適用:對(duì)象數(shù)量變化少,簡(jiǎn)單對(duì)象,隨機(jī)訪問元素頻繁
list適用:對(duì)象數(shù)量變化大,對(duì)象復(fù)雜,插入和刪除頻繁
Qt中的?QList & QVector
Qlist、QVector 與 list、vector似乎不太類似;list插入刪除很快,vector查詢很快。
但QList?是基于index標(biāo)簽存儲(chǔ)它的元素項(xiàng)在內(nèi)存(雖然內(nèi)存不連續(xù),這點(diǎn)與list 是一樣的),可以使用?[ ]運(yùn)算符。
vector注意事項(xiàng):? ? ? ? 如果你添加元素,但是vector的容量(是容量,不是大小,容量比大小大,會(huì)預(yù)先多分配空間)不夠的話,系統(tǒng)就會(huì)重新分配一段內(nèi)存,然后把原先的內(nèi)容全部拷貝過去,然后刪除原先的內(nèi)容。所以,如果你設(shè)定了一個(gè)指向vector的指針,或者說迭代器,在你添加元素之后,這個(gè)指針(迭代器)需要重新計(jì)算。
Qt官方解釋:
QList和QVector等容器的區(qū)別:
1、大多數(shù)情況下可以用QList。像prepend()和insert()這種操作,通常QList比QVector快的多。這是因?yàn)镼List是基于index標(biāo)簽存儲(chǔ)它的元素項(xiàng)在內(nèi)存中,比那種依賴iterator迭代的更快捷。而且你的代碼也更少。
2、如果你需要一個(gè)真正的連接著的list,且需要保證一個(gè)固定插入耗時(shí)。那就用迭代器,而不是標(biāo)簽。使用QLinkedList();
3、如果你需要開辟連續(xù)的內(nèi)存空間存儲(chǔ),或者你的元素遠(yuǎn)比一個(gè)指針大,這時(shí)你需要避免個(gè)別插入操作,出現(xiàn)堆棧溢出,這時(shí)候用QVector
4、如果你需要一個(gè)低層的可變數(shù)量大小的數(shù)組,用QVarLengthArray就夠了。他可以預(yù)先在棧中分配已知長(zhǎng)度大小的數(shù)組,如果超過這個(gè)長(zhǎng)度,會(huì)在堆中繼續(xù)存儲(chǔ)。默認(rèn)大小256
?翻譯自:
- For most purposes,?QList?is the right class to use. Operations like?prepend() and?insert() are usually faster than with QVector because of the way?QList?stores its items in memory (see?Algorithmic Complexity?for details), and its index-based API is more convenient than?QLinkedList's iterator-based API. It also expands to less code in your executable.
- If you need a real linked list, with guarantees of?constant time?insertions in the middle of the list and iterators to items rather than indexes, use?QLinkedList.
- If you want the items to occupy adjacent memory positions, or if your items are larger than a pointer and you want to avoid the overhead of allocating them on the heap individually at insertion time, then use QVector.
- If you want a low-level variable-size array,?QVarLengthArray?may be sufficient.
QVector
QVector,是Qt對(duì)所有數(shù)組的封裝,比如我們想要一個(gè)int類型數(shù)組,我們?cè)葧?huì)寫int array[10],我們?cè)赒t里可以寫QVector<int> array(10)
賦值的時(shí)候,我們依然可以照舊array[5]=4;想獲取某一項(xiàng)的值也還可以array[9],也就是說,原來的特性我們還可以用。
那么QVector有什么好處呢?
·我們可以用count函數(shù)獲知數(shù)組中有多少個(gè)元素,方便遍歷;
·原先我們必須預(yù)定義好大小,而用QVector我們雖然最好也先定義好大小,但是預(yù)先不定義也可以。
我們可以使用append函數(shù)或者<<操作符來在數(shù)組最后端添加元素而不用擔(dān)心溢出問題。
總結(jié)
以上是生活随笔為你收集整理的Qt工作笔记-QList (链表) QVector (数组)【转载】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt工作笔记-使用信号与槽让两个界面进行
- 下一篇: Qt文档阅读笔记-QPropertyAn