2012-05-11 49 views
-1

我需要一個可以動態改變大小的char數組。我不知道它有多大,所以預分配不是一種選擇。它永遠不會超過20個字節1次,下一次可能會達到5kb ...可變大小的char數組最小化調用新的?

我想分配像一個std向量。

我想用一個std矢量<焦炭>但所有這些推背看起來他們浪費時間:

strVec.clear(); 
for(size_t i = 0; i < varLen; ++i) 
{ 
    strVec.push_back(0); 
} 

這是我能做的最好的或者是有沒有辦法添加了一堆物品一次向量?或者,也許更好的方法來做到這一點。

感謝

+0

請參閱[這裏](http://www.cplusplus.com/reference/stl/vector/resize/) – Shahbaz

+0

什麼是數據用於? –

+2

'std :: vector'有一個方法'reserve'就是爲了這個目的。 – AJG85

回答

3

std::vector不會每次調用push_back時間分配內存,但只有當大小比容量

1

可以使用resize成員函數添加了一堆。不過,我不希望push_back會很慢,尤其是如果向量的內部容量已經不平凡的話。

+0

考慮到它幾乎是一個恆定的時間操作,push_back很好,在添加元素之前我唯一設置容器大小的時候是我必須使用一些寫入緩衝區的C api。好的回答+1 – johnathon

2

第一大,不優化,直到你異形你的代碼,並確定有瓶頸。考慮可讀性,可訪問性和可維護性的成本,做一些巧妙的事情。確保您採取的任何計劃不會妨礙您將來使用Unicode。還在?好的。正如其他人所提到的,媒介預留比最初使用的內存更多的內存,並且push_back通常非常便宜。

但是,有些情況下,使用push_back重新分配內存超過了必要的範圍。例如,對myvector.push_back()的一百萬次調用可能會觸發myvector的10或20次重新分配。另一方面,在其末尾插入一個向量將導致myvector *最多重新分配1次。出於速度和可讀性的原因,我通常更喜歡插入習慣用於reserve/push_back成語。

myvector.insert(myvector.end(), inputBegin, inputEnd) 

如果你不知道你的字符串提前大小和無法容忍的重新分配造成的,因爲也許是硬實時限制,打嗝,那麼也許你應該使用鏈表。鏈接列表的性能會以性能差得多的代價保持一致。

如果所有這些都不足以達到您的目的,請考慮其他數據結構,例如rope或回覆關於您的案例的更多細節。

  • 從斯科特·梅耶的有效STL,IIRC
1

這是我能做的最好的還是有辦法一堆物品的一次性添加到載體?或者,也許更好的方法來做到這一點。

push_back不是很慢,它只是比較大小和當前的容量,並在必要時重新分配。由於CPU上的分支預測和超標量執行,比較可能基本爲零。重新分配執行O(log N)次,所以向量使用多達兩倍的內存,但花在重新分配上的時間很少加起來。

要一次插入多個項目,請使用insert。有一些重載,唯一的竅門是你需要明確地通過end

my_vec.insert(my_vec.end(), num_to_add, initial_value); 
my_vec.insert(my_vec.end(), first, last); // iterators or pointers 

對於第二種形式,可以先將數組放入數組中,然後將數組複製到矢量的末尾。但是,這可能會增加複雜性,因爲它消除了。這就是微觀優化的方式。只有嘗試優化,如果你知道有一個可衡量的收穫。