2010-05-03 89 views
1

a previous question about vector capacity,貝利先生說:C++的std :: vector的內存/分配

在當前的C++可以保證不發生重新分配後的呼叫保留,直到插入將採取大小超出值之前的預留通話。在保留呼叫之前,或者在呼叫保留時,如果大小介於之前保留的呼叫的值和容量之間,則允許實施儘早重新分配。

因此,如果我理解正確,爲了確保在容量超過之前不會發生重新分配,我必須做兩次儲備?你能澄清一下嗎?

我使用矢量作爲這樣的存儲棧:

std::vector<double> memory; 
memory.reserve(size); 
memory.insert(memory.end(), matrix.data().begin(), matrix.data().end()); // smaller than size 
memory.resize(memory.capacity(), 0); 

我需要保證重新分配並不在上述情況發生。

謝謝。

PS:我也想知道是否有比矢量

回答

4

我想你是在讀錯誤的說法。允許儲備將capacity設置爲比您保留的金額更大的金額。如果您要保留的數量比您上次更多,但尚未達到當前容量,則使用特殊語言可以重新分配實施。

+0

好的,謝謝。 我不是說英語的人,那句話對我來說有點困惑 – Anycorn 2010-05-03 22:20:52

+0

@Mark,我覺得這個條目不太清楚。 C++的0 23.3.6.2.2 FCD更清晰:作用:一個指令,通知向量計劃的更改大小,以便它可以相應地管理存儲分配。在reserve()之後,如果 重新分配發生,capacity()大於或等於reserve的參數;並等於先前的capacity()的值,否則。當且僅當當前容量小於reserve()的參數時,此時重新分配 。如果除非通過非CopyConstructible類型的移動構造函數引發異常 ,則不會有效果。 – 2010-05-03 23:31:31

0

它重新分配時,它需要更多的其他類似的方式來管理內存堆棧一個更好的辦法。你不需要預留兩次。如果您正在進行大量插入,並且您對所存儲內容的大小有充分的瞭解,那麼使用預留是個不錯的主意。它快得多。

0

您不需要撥打reserve兩次。

此外,在發佈的代碼示例中,您只需調用reserve一次。實際上,您正在粘貼的代碼會影響矢量的size。見23.3.6.2.11(的C++ 0x FCD)上的void resize(size_type sz, const T& c);影響:

if (sz > size()) 
    insert(end(), sz-size(), c); 
else if (sz < size()) 
    erase(begin()+sz, end()); 
else 
    ; // do nothing 

所以,基本上,當你調用memory.resize(memory.capacity(), 0),你是,實際上,追加對0,您的來電以下memory.capacity() - memory.size()memory.insert

+0

這是intent.I需要一些零內存 – Anycorn 2010-05-04 01:13:33

相關問題