2013-04-25 85 views
0

任何人都可以解釋爲什麼在vector容器中,push_back操作通常比較慢? 我聽到有人說,但找不到它慢一點的原因。容器:矢量類....慢

作爲初學者,我想使用vector和push_back,但是爲​​了獲得更好的性能,我還需要其他選項嗎?請告訴我。謝謝,

+3

比什麼慢? – mfontanini 2013-04-25 01:27:27

+0

請注意'std :: vector'只管理你放入它的對象。它添加,刪除,修改它包含的元素等。但是,大部分工作,特別是複製操作,都是由矢量包含的對象完成的。因此它大部分不在'std :: vector'本身,它本身很慢,但在操作中,也就是它使用的'std :: vector'包含的對象。 – 2013-04-25 01:34:17

回答

0

當您追加或插入項目到std::vector可能沒有足夠的空間來存儲它。這會導致向量分配足夠的存儲空間來容納所有元素並將其複製到新的內存塊中。如果按值存儲對象而不是按指針存儲對象,則會創建一個完整的副本。對於複雜的類型,這可能涉及幷包含額外的分配和複製。在這種情況下,性能可能會受到矢量大小的影響。對於大型矢量,性能受到的影響將更加明顯。

0

push_back操作並不總是較慢。它具有不變的複雜性(攤銷時間)。唯一的一次是速度較慢,如果重新分配發生。關於std::vector的一個有用的事情是,無論大小如何,您都可以將對象添加到矢量中。讓向量的容量爲10,向量中有10個對象,然後重新分配以使向量變大。通常情況下,矢量大小加倍,對象被複制到新的矢量中,這是一個較慢的操作。

1

向量將其對象存儲在一個連續的數組中。它分配一定數量的空間(它的容量)來包含對象;當對象數量(其大小爲)即將超過容量時,它將分配更大的空間並複製(或移動)現有對象。

這可能需要一些時間。爲了避免它,並保證push_backinsert不需要重新分配,您可以撥打reserve預先爲您的需求分配足夠大的塊。