Qt工作笔记-QList (链表) QVector (数组)【转载】
原文地址:https://blog.csdn.net/qq_33266987/article/details/53333373
C++中的list 和 vector
(1)、
stl提供了三個最基本的容器:vector,list,deque。
vector和built-in數組類似,它擁有一段連續的內存空間,并且起始地址不變,因此它能非常好的支持隨即存取,即?[]操作符,但由于它的內存空間是連續的,所以在中間進行插入和刪除會造成內存塊的拷貝,另外,當該數組后的內存空間不夠時,需要重新申請一塊足夠大的內存并進行內存的拷貝。這些都大大影響了vector的效率。
list就是數據結構中的雙向鏈表(根據sgi stl源代碼),因此它的內存空間可以是不連續的,通過指針來進行數據的訪問,這個特點使得它的隨即存取變的非常沒有效率,因此它沒有提供[]?操作符的重載。但由于鏈表的特點,它可以以很好的效率支持任意地方的刪除和插入。
deque是一個double-ended queue,它的具體實現不太清楚,但知道它具有以下兩個特點:
它支持[]操作符,也就是支持隨即存取,并且和vector的效率相差無幾,它支持在兩端的操作:push_back,push_front,pop_back,pop_front等,并且在兩端操作上與list的效率也差不多。
因此在實際使用時,如何選擇這三個容器中哪一個,應根據你的需要而定,一般應遵循下面
的原則:
? 1、如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector
? 2、如果你需要大量的插入和刪除,而不關心隨即存取,則應使用list
? 3、如果你需要隨即存取,而且關心兩端數據的插入和刪除,則應使用deque。
(2)、
vector為存儲的對象分配一塊連續的地址空間,因此對vector中的元素隨機訪問效率很高。在vecotor中插入或者刪除某個元素,需要將現有元素進行復制,移動。如果vector中存儲的對象很大,或者構造函數復雜,則在對現有元素進行拷貝時開銷較大,因為拷貝對象要調用拷貝構造函數。對于簡單的小對象,vector的效率優于list。vector在每次擴張容量的時候,將容量擴展2倍,這樣對于小對象來說,效率是很高的。
list中的對象是離散存儲的,隨機訪問某個元素需要遍歷list。在list中插入元素,尤其是在首尾插入元素,效率很高,只需要改變元素的指針。
綜上所述:
vector適用:對象數量變化少,簡單對象,隨機訪問元素頻繁
list適用:對象數量變化大,對象復雜,插入和刪除頻繁
Qt中的?QList & QVector
Qlist、QVector 與 list、vector似乎不太類似;list插入刪除很快,vector查詢很快。
但QList?是基于index標簽存儲它的元素項在內存(雖然內存不連續,這點與list 是一樣的),可以使用?[ ]運算符。
vector注意事項:? ? ? ? 如果你添加元素,但是vector的容量(是容量,不是大小,容量比大小大,會預先多分配空間)不夠的話,系統就會重新分配一段內存,然后把原先的內容全部拷貝過去,然后刪除原先的內容。所以,如果你設定了一個指向vector的指針,或者說迭代器,在你添加元素之后,這個指針(迭代器)需要重新計算。
Qt官方解釋:
QList和QVector等容器的區別:
1、大多數情況下可以用QList。像prepend()和insert()這種操作,通常QList比QVector快的多。這是因為QList是基于index標簽存儲它的元素項在內存中,比那種依賴iterator迭代的更快捷。而且你的代碼也更少。
2、如果你需要一個真正的連接著的list,且需要保證一個固定插入耗時。那就用迭代器,而不是標簽。使用QLinkedList();
3、如果你需要開辟連續的內存空間存儲,或者你的元素遠比一個指針大,這時你需要避免個別插入操作,出現堆棧溢出,這時候用QVector
4、如果你需要一個低層的可變數量大小的數組,用QVarLengthArray就夠了。他可以預先在棧中分配已知長度大小的數組,如果超過這個長度,會在堆中繼續存儲。默認大小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對所有數組的封裝,比如我們想要一個int類型數組,我們原先會寫int array[10],我們在Qt里可以寫QVector<int> array(10)
賦值的時候,我們依然可以照舊array[5]=4;想獲取某一項的值也還可以array[9],也就是說,原來的特性我們還可以用。
那么QVector有什么好處呢?
·我們可以用count函數獲知數組中有多少個元素,方便遍歷;
·原先我們必須預定義好大小,而用QVector我們雖然最好也先定義好大小,但是預先不定義也可以。
我們可以使用append函數或者<<操作符來在數組最后端添加元素而不用擔心溢出問題。
總結
以上是生活随笔為你收集整理的Qt工作笔记-QList (链表) QVector (数组)【转载】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt工作笔记-使用信号与槽让两个界面进行
- 下一篇: Qt文档阅读笔记-QPropertyAn