2014-05-21 175 views
0

在C++中,只需使用push_back方法即可將元素添加到矢量中。該方法修改矢量的大小。 那麼使用std :: vector :: reserve的目標是什麼?我應該什麼時候使用它?爲什麼使用std :: vector :: reserve有用?

+2

它是最小化或徹底消除緩衝區調整大小和引入的命中(複製/移動會變得昂貴,特別是對於大型對象的數量)。在'operator new/delete'宇宙中沒有'realloc'等價物。要「擴展」分配,需要單獨分配,複製或移動,然後釋放舊內存。通過「聲明」你的意圖,你可以避免這種細微差別。一隻卑鄙的兔子很可愛。百萬平均的兔子是一個問題)。 – WhozCraig

回答

3

當您知道至少有n個元素進入矢量時,您可以使用保留。調整容器大小是一項代價高昂的操作 - 您分配新內存,將舊內容複製到內存中,然後刪除舊的內存。如果您默認知道您將獲得至少10000個元素,則最好爲矢量保留大小,而不是讓矢量重新分配內存超過必要的次數。

簡而言之,就是效率。

+3

比效率更重要:它確保迭代器保持有效。 –

2

調整載體可以顯著降低執行速度(例如追加大量的數據給它時)

基準表示:

This effectively increases the container size by one, which causes an automatic 
reallocation of the allocated storage space if -and only if- the new vector size 
surpasses the current vector capacity. 

所以有助於尺寸的向量上的值,其中你理想情況下,對於您的所有數據來說都足夠了,而且還沒有剩下。矢量縮減的調整大小時間將加速您的應用程序

1

這是出於效率的原因 - 您可以根據需要爲內存分配儘可能多的元素,如果您知道初始化 - 這種方式向量可以一次分配所有內容,並且如果超過分配的大小將不會增加。

[4] Reserve()會導致手動重新分配。 使用reserve()的主要原因是效率:如果您知道您的最終容量必須增長,那麼通常更有效率的是一次分配該內存,而不是依靠自動的 重新分配方案。使用reserve()的另一個原因是你可以控制迭代器的失效。

Source

4

它可以用來保證迭代器的有效性,或作爲優化。向矢量添加元素時,如果新大小大於容量,則矢量必須重新分配,將所有現有元素複製(或移動)到新緩衝區中。這使所有迭代器都無效,並且可能很昂貴。儲備功能確保最小的容量。如果您事先知道最大大小並對其進行預留,那麼添加元素將永遠不會使新元素前面的迭代器失效,並且永遠不會需要複製。 (對於大多數代碼,這是迭代器有效性的問題,強制使用保留。)

+0

因此,作爲一個最佳實踐的問題,應該總是呼叫儲備以避免這些副作用? – Brian

+1

+1應該注意的是,即使有一個*充足的保留緩衝區,一個「插入(v.begin()...)」,並且世界在迭代器有效性方面崩潰。他們*全部*在下巴上,即使沒有調整大小。 – WhozCraig

+2

@staticx不一定。很多時候,例如,在相對較小的循環中執行'push_back',顯然沒有迭代器。在這種情況下,調用保留沒有意義(當你不能在最終元素數上設置合理的上限時,你也不能真正有效地使用它)。 –

相關問題