2012-06-02 56 views
4

通過讀取std::vector參考我理解的是控制的std ::矢量再分配

  1. 主叫insert當達到最大容量將導致std::vector(導致迭代器失效)的重新分配,因爲新的存儲器是以更大的容量分配給它。目標是保持關於連續數據的保證。

  2. 只要我堅持低於最大容量insert將不會導致(和迭代器將完好無損)。

我的問題是:

reserveinsert自動調用,有沒有什麼辦法來控制多新的內存必須如何保留?

假設我有一個初始容量爲100的向量,當最大容量被命中時,我想分配一個額外的20個字節。

有沒有可能這樣做?

回答

5

您可以隨時自行跟蹤並在分配之前調用預留,例如,

static const int N = 20 // Amount to grow by 
if (vec.capacity() == vec.size()) { 
    vec.reserve(vec.size() + N); 
} 
vec.insert(...); 

您可以在自己的函數,把這個包,並調用該函數,而不是直接調用insert()

+0

我不明白這是如何明智的。對'reserve()'的調用將重新分配所有元素,然後在調用insert()時你會得到另一組副本。除此之外,'reserve()'只保證*至少*所需的大小,並且可能事實上保留更多。 – jrok

+0

問題是我該如何控制它。這是你可以得到的最大的控制,即使它分配更多,你永遠不會得到這個if語句沒有捕獲的分配,儘管它們可能比你問的要大。 – Flexo

+0

我的觀點是,爲什麼不讓'insert()'做它的工作? – jrok