QVector
std::vector
正如您可能会从名称中猜到的,它基本上类似于。 QList
更接近boost::ptr_deque
,尽管与表观结合std::list
。它不直接存储对象,而是存储指向它们的指针。您将获得两端快速插入的所有好处,并且重新分配涉及改组指针而不是复制构造函数,但失去了realstd::deque
或的空间局部性std::vector
,并获得了很多堆分配。它确实有一些决策可以避免为小对象分配堆,从而重新获得空间局部性,但据我了解,它仅适用于小于的事物int
。
QLinkedList
与相似std::list
,并且具有所有缺点。一般来说,这应该是您对容器的最后选择。
QT库非常喜欢使用QList
对象,因此在您自己的代码中偏爱对象有时可以避免不必要的乏味。从理论上讲,额外的堆使用和实际数据的随机放置在某些情况下可能会受到损害,但通常并不明显。所以我建议使用,QList
直到分析建议更改为为止QVector
。如果您希望连续分配很重要[阅读:您正在与需要aT[]
而不是a的代码交互QList<T>
],这也可能是立即开始的原因QVector
。
如果您一般是在询问容器,而只是使用QT文档作为参考,那么以上信息将没有太大用处。
Anstd::vector
是一个可以调整大小的数组。所有元素都彼此相邻存储,您可以快速访问单个元素。缺点是插入仅在一端有效。如果在中间或开头放置了某些内容,则必须复制其他对象以腾出空间。用大哦表示法,最后插入是O(1),在其他任何地方插入是O(N),随机访问是O(1)。
Anstd::deque
是相似的,但不保证对象彼此相邻存储,并且允许在两端插入O(1)。它还需要一次分配较小的内存块,这有时很重要。随机访问为O(1),中间插入为O(N),与a相同vector
。空间局部性比差std::vector
,但对象倾向于聚集,因此您可以获得一些好处。
Anstd::list
是一个链表。它需要三个标准顺序容器中最多的内存开销,但是可以在任何地方快速插入...只要事先知道需要在哪里插入。它不提供对单个元素的随机访问,因此您必须迭代O(N)。但是一旦到达,实际的插入就是O(1)。最大的好处std::list
是您可以将它们快速拼接在一起...如果将整个范围的值移动到另一个std::list
,则整个操作为O(1)。使列表中的引用无效也要困难得多,有时这很重要。
作为一般规则,我宁愿std::deque
到std::vector
,除非我需要能够将数据传递给需要原始阵列库。 std::vector
被保证是连续的,因此&v[0]
可用于此目的。我不记得上次使用了std::list
,但这几乎可以肯定是因为我需要对引用保持有效的有力保证。