QVector
很大程度上类似于std::vector
,你可以从名称中猜测到。 QList
更接近于boost::ptr_deque
,尽管与std::list
有明显联系。它不直接存储对象,而是存储指向它们的指针。你可以在两端快速插入,并且重新分配只涉及指针移动而不是复制构造函数,但会失去实际std::deque
或std::vector
的空间局部性,并获得许多堆分配。它确实需要一些决策来避免小对象的堆分配,以恢复空间局部性,但据我所知,它仅适用于比int
小的东西。
QLinkedList
类似于std::list
,并具有所有其缺点。一般来说,这应该是您最后选择的容器。
QT库非常喜欢使用QList
对象,因此在您自己的代码中也应优先考虑使用它,有时可以避免一些不必要的繁琐操作。额外的堆使用和实际数据的随机定位在某些情况下理论上可能会有所损失,但通常是不可感知的。因此,我建议在性能分析表明需要更改为QVector
之前使用QList
。如果您希望连续分配很重要[即:您正在与期望T[]
而不是QList<T>
的代码进行交互],这也可以成为从一开始就使用QVector
的原因。
如果您询问容器的一般信息,并只是将QT文档作为参考,则上述信息较少有用。
std::vector
是可以调整大小的数组。所有元素都存储在一起,您可以快速访问单个元素。缺点是插入只在一端有效率。如果在中间或开头放置某些内容,则必须复制其他对象以腾出空间。在大O符号表示法中,插入到末尾的时间复杂度为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
是什么时候了,但几乎肯定是因为我需要更强的引用有效性保证。
std::deque
和std::vector
的性能吗?你会感到惊讶的... - Marc Mutz - mmutz