提问人:jcuenod 提问时间:7/7/2011 最后编辑:AAEMjcuenod 更新时间:2/23/2019 访问量:63078
QVector 与 QList
QVector vs QList
问:
我有一个需要迭代的整数列表,但数组是不够的。
和之间有什么区别,在选择类型之前,我需要了解什么吗?vectors
lists
需要明确的是,我已经阅读了 QT 文档,但这就是我所知道的程度:
QList<T>
、 和 提供类似的功能。概述如下:QLinkedList<T>
QVector<T>
- 对于大多数用途,是要使用的正确类。它基于索引的 API 比基于迭代器的 API 更方便,并且由于它在内存中存储项目的方式,它通常比它更快。它还扩展到可执行文件中的更少代码。
QList
QLinkedList's
QVector
- 如果您需要一个真正的链表,并保证在列表中间插入恒定时间,并且迭代器指向项目而不是索引,请使用 .
QLinkedList
- 如果希望项目占据相邻的内存位置,请使用 .
QVector
答:
in 类似于 。 类似于 。 是基于索引的向量,但不能保证内存位置(如)。QVector
std::vector
QLinkedList
std::list
QList
std::deque
QVector
主要类似于 ,正如您可能从名称中猜到的那样。 更接近 ,尽管与 有明显的关联。它不直接存储对象,而是存储指向它们的指针。您可以获得两端快速插入的所有好处,并且重新分配涉及随机指针而不是复制构造函数,但会丢失实际 or 的空间位置,并获得大量堆分配。它确实有一些决策来避免小对象的堆分配,重新获得空间局部性,但据我所知,它仅适用于小于 .std::vector
QList
boost::ptr_deque
std::list
std::deque
std::vector
int
QLinkedList
类似于 ,并且具有它的所有缺点。一般来说,这应该是您最后选择的容器。std::list
QT 库非常倾向于使用对象,因此在您自己的代码中支持它们有时可以避免一些不必要的乏味。从理论上讲,在某些情况下,额外的堆使用和实际数据的随机定位可能会造成伤害,但通常不会引起注意。因此,我建议使用 until 分析建议更改为 .如果你期望连续分配很重要[阅读:你正在与期望 a 而不是 a 的代码进行交互],这也可能是立即开始的原因。QList
QList
QVector
T[]
QList<T>
QVector
如果您询问的是一般的容器,并且只是使用 QT 文档作为参考,那么上述信息就不太有用了。
An 是可以调整大小的数组。所有元素都彼此相邻存储,您可以快速访问各个元素。缺点是插入仅在一端有效。如果你把一些东西放在中间,或者放在开头,你必须复制其他对象来腾出空间。在 big-oh 表示法中,末尾插入是 O(1),其他任何地方插入是 O(N),随机访问是 O(1)。std::vector
An 是相似的,但不能保证对象彼此相邻存储,并允许在两端插入 O(1)。它还需要一次分配较小的内存块,这有时可能很重要。随机存取是 O(1),中间的插入是 O(N),与 a 相同。空间局部性比 差,但对象倾向于聚类,因此您可以获得一些好处。std::deque
vector
std::vector
An 是链表。在三个标准顺序容器中,它需要最多的内存开销,但可以在任何地方快速插入......前提是您事先知道需要插入的位置。它不提供对单个元素的随机访问,因此您必须在 O(N) 中迭代。但是一旦到达那里,实际插入是 O(1)。最大的好处是您可以快速将它们拼接在一起......如果将整个值范围移动到不同的值,则整个运算为 O(1)。使列表中的引用无效也要困难得多,这有时可能很重要。std::list
std::list
std::list
作为一般规则,我更喜欢 ,除非我需要能够将数据传递给需要原始数组的库。 保证是连续的,因此适用于此目的。我不记得我上一次使用 是什么时候了,但几乎可以肯定是因为我需要更强的保证参考文献仍然有效。std::deque
std::vector
std::vector
&v[0]
std::list
评论
std::deque
std::vector
QVector
就像一个可以改变大小(增加或减少)的数组,但它伴随着繁重的事务、计算和时间。
例如,如果要添加一个项目,则创建一个新数组,将所有项目复制到新数组,将新项目添加到末尾,并删除旧数组。反之亦然。
但是,适用于指针。因此,当创建新项目时,只会分配一个新的内存空间并将其链接到唯一的内存块。由于它与指针一起工作,因此更快、更高效。QLinkedList
如果您有不希望更改大小的项目列表,那可能很好,但通常用于大多数目的。QVector
QLinkedList
评论
来自QtList文档:
QList 在大多数情况下使用。对于包含一千个项的结构,可以在中间高效插入,并提供索引访问。 而且速度非常快,因为内存是在内部阵列的两端预先分配的。 是 T 类型的指针数组。如果 T 具有指针或类似 Qt 共享的指针类型,则对象直接存储在数组中
prepend()
append()
QList<T>
QVector
在大量或大小大于指针的新项的情况下的首选,因为在单个堆分配中为其项分配内存。对于 ,插入新项的追加需要在堆上分配新项的内存。简言之,如果希望项目占据相邻的内存位置,或者项目大于指针,并且希望避免在插入时将它们单独分配给堆的开销,请使用 .append()
insert()
QVector
QList
QVector
情况发生了变化
我们现在在Qt 5.8中,情况发生了变化,所以文档。它对这个问题给出了一个明确而不同的答案:
QVector
should be your default first choice. will usually give better performance than >, because always stores its items sequentially in memory, where will allocate its items on the heap unless and T has been declared to be either a or a using .QVector<T>
QList<T
QVector<T>
QList<T>
sizeof(T) <= sizeof(void*)
Q_MOVABLE_TYPE
Q_PRIMITIVE_TYPE
Q_DECLARE_TYPEINFO
See the Pros and Cons of Using for an explanation. However, is used throughout the Qt APIs for passing parameters and for returning values. Use to interface with those APIs.
QList
QList
QList
评论