2013-04-25 73 views
2

的矢量假設如何保留內存爲載體

vector<vector<shared_ptr<Base>>> vec 
vec.reserve(100) 
vec[0].reserve(20) // Error : vector subscript out of range 

我想保留內存兩種外載體和內載體。 我知道vec是空的,所以我不能爲內部向量保留內存。之後我只能使用resize()shrink_to_fit()。但是,使用resize()shrink_to_fit()是沒用的,因爲這不是我想要做的。

用於內矢量保留存儲器的目的是試圖分配存儲器以及爲後來提高搜索速度內元件。我只是想知道如果我不保留內存,預先分配的內存是昂貴和混亂。

我想問:

  1. 是否有什麼辦法可以保留內存內矢量
  2. 難道我的「關於左右的內存壞分配的概念,將不爲載體保留內存引起的「對嗎?

對不起,我的英文不好,我使用VC++ 2010

+0

[vector :: resize()和vector :: reserve()之間的選擇可能重複(http://stackoverflow.com/questions/7397768/choice-between-vectorresize-and-vectorreserve)。 – mfontanini 2013-04-25 17:19:28

+1

直到您通過分析工具證明這是通過代碼的關鍵條帶來問題時,請不要擔心。 – djechlin 2013-04-25 17:19:33

+0

Bjarne Stroustrup本人不再擔心預留矢量空間,請參閱http://www.stroustrup.com/bs_faq2.html#slow-containers – 2013-04-25 17:23:42

回答

4

您不能爲兩個載體保留內存...的載體沒有得到如果您只在外部向量中保留空間,則構造它。您可以調整外部矢量的大小,然後爲其中的每個元素進行預留,或者可以在添加內部矢量時進行預留。

2

如果你確定你需要做到這一點在所有的,我可能會調整外載體,然後在每個內部矢量預留空間。

如果100個元素甚至接近準確,那麼外部向量的空間幾乎無關緊要(典型情況是32位系統上的1200字節或64位系統上的2400字節)。

這可能會有點不太方便(可以迫使你跟蹤有多少項創建真正在使用中對),但如果你想在你的內心向量預留空間,你真的沒有很多的選擇。

+0

我會在20個元素下使用,我知道外部和內部矢量的精確最大元素。我可以解釋一下,我的擔憂是過度擔憂,問題實際上可以忽略不計? – bschung5 2013-04-25 17:43:04

+0

如果您開始瞭解外部和內部向量中的項目數,則可能最有意義的是爲外部向量保留正確的大小,然後在將其推入外部向量之前按其正確的大小創建每個內部向量(但是,是的,忽略所有這些可能不會傷害太多)。 – 2013-04-25 18:03:24

0

我想先介紹一下如何與最終容器進行交互以及事先了解其內容。一旦你確定了一個方便的界面,你可以實現它後面的代碼。例如,您可以確保每個新的內部矢量都以100個元素的容量創建。或者,您可以使用x/y對中的映射到共享指針,這可以在稀疏填充的容器中使用。或者靜態分配100x100元素,而不是重新分配呢?重要的一點是,所有這些替代品都可以在不改變最終容器界面的情況下實施,因此這使您可以自由地嘗試不同的方法。

BTW:退房make_shared,這避免shared_ptr的分配開銷,我相信。另外,Boost也有一個使用內部參考計數器的intrusive_ptr。這些shared_ptr實例也只是shared_ptr的一半大小。但是,您需要基準來實際證明哪種方式最快。其他任何事情或多或少都是模糊的猜測和猜測。