QVector
大致類似於std::vector
,正如您可能從名字中猜出的那樣。 QList
更接近boost::ptr_deque
,儘管與std::list
有明顯關聯。它不直接存儲對象,而是存儲指向它們的指針。您可以獲得兩端快速插入的所有好處,並且重新分配涉及洗牌指針而不是複製構造函數,但會丟失實際的std::deque
或std::vector
的空間局部性,並獲得大量堆分配。它確實做出了一些決定,以避免小對象的堆分配,重新獲得空間局部性,但根據我的理解,它僅適用於小於int
的事物。
QLinkedList
類似於std::list
,並且具有它的所有缺點。一般來說,這應該是你最後一個容器的選擇。
QT庫非常喜歡使用QList
對象,所以在自己的代碼中使用它們有時可以避免一些不必要的乏味。額外的堆使用和實際數據的隨機定位理論上可能會在某些情況下受到傷害,但通常是不可忽略的。所以我會建議使用QList
,直到分析建議更改爲QVector
。如果您希望連續分配很重要[請閱讀:您正在與期望T[]
而不是QList<T>
]的代碼進行交互,這也可能是從QVector
開始的理由。
如果您一般詢問容器,只是使用QT文檔作爲參考,那麼上述信息就沒那麼有用了。
std::vector
是一個可以調整大小的數組。所有元素都相鄰存儲,您可以快速訪問各個元素。缺點是插入僅在一端有效。如果你把東西放在中間或開始,你必須複製其他物體以騰出空間。在大的表示法中,最後的插入是O(1),插入的其他地方是O(N),隨機訪問是O(1)。
std::deque
是類似的,但不保證對象存儲在彼此相鄰,並允許在兩端插入爲O(1)。它還需要一次分配更小的內存塊,這有時很重要。隨機訪問爲O(1),中間插入爲O(N),與vector
相同。空間局部性比std::vector
差,但對象往往是聚集在一起,所以你可以獲得一些好處。
一個std::list
是一個鏈表。它需要三個標準順序容器的最大內存開銷,但可以在任何地方提供快速插入...提前知道需要插入的位置。它不提供對單個元素的隨機訪問,所以你必須迭代O(N)。但是一旦出現,實際的插入就是O(1)。 std::list
的最大好處是可以快速將它們拼接在一起......如果將整個範圍的值移動到不同的std::list
,則整個操作爲O(1)。將列表中的引用無效也很難,這有時很重要。
作爲一般規則,我寧願std::deque
到std::vector
,除非我需要能夠將數據傳遞給需要原始陣列庫。 std::vector
保證連續,所以&v[0]
適用於此目的。我不記得我最後一次使用std::list
,但幾乎可以肯定,因爲我需要更強大的保證參考文件有效。
真棒,非常感謝詳細的回覆 – jcuenod
FWIW,std :: deque對引用有很好的保證。迭代器很容易失效,但指向成員的指針對於出隊操作非常健壯。 – Ben
很好的回答。但我還有一個問題:迭代速度更快?我有一組對象,它們並不經常插入或移除,但我需要儘可能快地遍歷對象。哪個更快? – gromit190