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