2012-05-06 142 views
5

我找不到這條信息。我正在處理一個奇怪的情況,在這裏我處於一個循環中,並且在任何給定時間我都可以獲得一個隨機信息。這些信息必須存儲在一個向量中。現在每幀我必須設置這個向量來確保我不會釋放空間(我正在使用索引將值寫入向量中的隨機點)。STL的矢量調整大小

現在假設沒有辦法改變這段代碼,我想知道,如果我發送的參數正好是向量的大小,那麼vector是否會「忽略」resize()函數?我在哪裏可以找到這些信息?

回答

9

從MSDN參考1

如果容器的大小小於所請求的大小,_Newsize,元件,直到它到達所請求的大小添加至載體中。如果容器的大小大於請求的大小,則最接近容器末尾的元素將被刪除,直到容器達到大小_Newsize。如果容器的本大小是相同的所請求的大小,不採取動作

的ISO C++標準(頁面485 2指定該行爲vector::resize

void resize (size_type sz , T c = T()); 

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

所以,是的,矢量忽略它,你不需要自己執行檢查。

0

有點不一樣。

使用resize()簡單調整矢量大小隻會導致更多的內存被矢量本身使用(會改變其元素使用的內存量)。如果預留空間內沒有足夠的空間,它將重新分配(有時候他們喜歡自己墊一點點,所以即使你可能會增長)。如果已經有足夠的空間容納所需的尺寸,並且無論它想要做什麼填充,它都不會再生。

當規範說明超過尺寸末尾的元素將被刪除時,這意味着到位。基本上它會爲它正在刪除的每個元素調用_M_buff [i]。〜T()。因此,任何內存分配將被刪除,假設一個工作的析構函數,但對象本身佔用的空間(它的大小)將不會。矢量將會增長,增長,並增長到你告訴它的最大尺寸,並且在它存在時不會重新收縮。