容器:向量类....慢

Posted

技术标签:

【中文标题】容器:向量类....慢【英文标题】:Container: Vector class.... Slow 【发布时间】:2013-04-25 01:24:59 【问题描述】:

谁能解释为什么在向量容器中,push_back 操作通常较慢? 我听有人这么说,但找不到慢一点的原因。

作为初学者,我想使用 vector 和 push_back,但我还有其他选择可以提高性能吗?请告诉我。谢谢,

【问题讨论】:

请注意,std::vector管理您放入其中的对象。它添加、删除、修改等它包含的元素。但是,完成的大部分工作,尤其是复制操作,都是由向量包含的对象完成的。因此,它主要不是在 std::vector 本身中很慢,而是在操作中,即 std::vector 包含的对象中,它使用。 【参考方案1】:

向量将其对象存储在一个连续的数组中。它分配一定数量的空间(其容量)来容纳对象;当对象的数量(其大小)即将超过容量时,它会分配更大的空间并复制(或移动)现有对象。

这可能需要一些时间。为避免这种情况,并保证push_backinsert 不需要重新分配,您可以调用reserve 预先分配足够大的块以满足您的需要。

【讨论】:

【参考方案2】:

当您向std::vector 添加或插入项目时,可能没有足够的空间来存储它。这会导致向量分配足够的存储空间来保存所有元素并将它们复制到新的内存块中。如果您按值而不是按指针存储对象,则将制作完整的副本。对于复杂类型,这可能会涉及并包括额外的分配和复制。在这种情况下,性能可能会受到矢量大小的影响。对于大型向量,性能损失会更加明显。

【讨论】:

【参考方案3】:

push_back 操作并不总是较慢。它具有恒定的复杂性(摊销时间)。唯一较慢的情况是发生重新分配时。 std::vector 的一个有用之处在于,无论大小如何,您都可以始终将对象添加到向量中。假设向量的容量为 10,向量中有 10 个对象,然后发生重新分配以使向量更大。通常,将向量大小加倍并将对象复制到新向量中,这是一个较慢的操作。

【讨论】:

以上是关于容器:向量类....慢的主要内容,如果未能解决你的问题,请参考以下文章

c++ 向量比我的动态数组慢?

如何在迭代器中正确引用第一个向量容器?

为啥向量总是比 C 数组慢,至少在这种情况下?

为啥向量长度 SIMD 代码比普通 C 慢

向量初始化比数组慢...为啥?

如果使用向量删除叠瓦式自己容器的析构函数中的 char* 成员,则崩溃