2012-07-01 36 views
1

我有一長串數據(n實體)。該數組中的每個對象都有一些值(比如說,對象的值爲m)。和我有一個像週期:填充未知大小的std :: vector的最快方法

myType* A; 

// reading the array of objects 
std::vector<anotherType> targetArray; 
int i, j, k = 0; 
for (i = 0; i < n; i++) 
    for (j = 0; j < m; j++) 
    { 
     if (check((A[i].fields[j])) 
     { 
      // creating and adding the object to targetArray 
      targetArray[k] = someGenerator(A[i].fields[j]); 
      k++; 
     } 
    } 

在一些情況下,我有Ñ *有效對象,在一些(Ñ *)/ 10或更小。
問題是如何爲targetArray分配內存?

  1. targetArray.reserve(n*m);
    // Do work
    targetArray.shrink_to_fit();

  2. 計數的要素,而不會產生對象,然後,因爲我需要分配儘可能多的內存,並用循環一次去。

  3. 在創建新對象的每次迭代中調整數組的大小。

我在每種方法中都看到了巨大的戰術錯誤。另一種方式來做到這一點?

+0

您是否考慮使用其他容器'std :: dequeue'而不是'std :: vector' ?? –

+0

它會在每個創作中添加內存嗎? –

+0

你有沒有考慮過'vector :: reserve()'? – jrok

回答

5

你在這裏做什麼叫做過早優化。默認情況下,std::vector會在內存不足以存儲新對象時以指數方式增加其內存佔用量。例如,第一個push_back將分配2個元素。第三個push_back將會增加一倍的尺寸等。只需堅持push_back並讓您的代碼工作。

只有當上述方法證明自己是設計中的瓶頸時,才應該開始考慮內存分配優化。如果發生這種情況,我認爲最好的辦法是爲一些有效的物體提供一個很好的近似值,並且只需在矢量上調用reserve()即可。像你的第一種方法。只要確保縮小以適合實現是正確的,因爲矢量不希望縮小。你必須使用swap

在每一步調整數組大小並不好,std::vector不會真的這樣做,除非你努力工作。

通過對象列表做一個額外的循環可以提供幫助,但也可能會造成傷害,因爲您可能很容易浪費CPU週期,膨脹CPU緩存等。如果有疑問 - 請對其進行分析。

+0

那麼,如果是129個對象進行存儲,輸出矢量最終會有256個對象的大小?修復後將'shrink_to_fit()'修好嗎?這不是我在這裏使用的縮小實現,它只是標準的'std :: vector's方法。 –

+0

如果你持續push_back,那麼yes - 256是你得到的,除非你在推送前手動將它保留到129。如果你使用C++ 11的'shrink_to_fit',那麼它應該完成這項工作。 – 2012-07-01 19:20:57

+0

謝謝。 //спасибо。 –

4

典型的方法是使用targetArray.push_back()。這會在需要時重新分配內存,並避免兩次傳遞數據。它有一個用於重新分配內存的系統,使得它非常高效,並且隨着向量變大,重新分配的次數也會減少。但是,如果你的check()函數速度非常快,那麼你可以通過兩次遍歷數據,確定你需要多少內存,並使得你的vector正確的大小開始,從而獲得更好的性能。我只會在分析確定它確實有必要時才這樣做。

相關問題