簡體   English   中英

分配向量大小與保留向量大小

[英]Assigning vector size vs reserving vector size

bigvalue_t result;
result.assign(left.size() + right.size(), 0);
int carry = 0;
for(size_t i = 0; i < left.size(); i++) {
   carry = 0;
   for(size_t j = 0; j < right.size(); j++) {
      int sum = result[i+j] + (left[i]*right[j]) + carry;
      result[i+j] = sum%10;
      carry = sum/10;
   }
   result[i+right.size()] = carry;
}
return result;

在這里,我使用assign分配結果的大小,並將結果正常傳遞回去。 當我使用result.reserve(left.size()+ right.size());時,該函數在兩個for循環中都正常運行。 當我以某種方式打印出result.size()時,它始終為0。儲備金不會分配任何空間嗎?

它被指定為

void reserve(size_type n);

效果:一種指令,該指令通知向量計划中的大小更改,以便可以相應地管理存儲分配。 如果發生重新分配,在reserve()之后,Capacity()大於或等於reserve的參數; 否則等於Capacity()的先前值。 當且僅當當前容量小於reserve()的參數時,才發生重新分配。 如果通過非CopyInsertable類型的move構造函數引發了異常,則沒有任何效果。

復雜性:它不會改變序列的大小,並且最多花費線性時間在序列的大小上。

因此,是的,它分配了內存,但沒有在容器內創建任何對象。 要在向量中實際創建盡可能多的元素,然后要通過op[]訪問它們,您需要調用resize()

reserve()用於需要時不時進行向量重分配之類的操作,而push_back()進行大量push_back()的操作。

儲備分配空間,但實際上並沒有創造任何東西。 它用於避免重新分配。

例如,如果要存儲10000個元素,可以通過push_back將其存儲到向量中,則可以使向量使用重新分配。 如果您在實際存儲元素之前使用了保留,那么向量准備好接受大約10000個元素,因此他准備好了,與不使用保留的情況相比,向量的填充將更快地進行。

調整大小 ,實際上會創造空間。 還要注意,調整大小會將元素初始化為默認值(因此,對於int來說,它將每個元素設置為0)。

PS-實際上,當您說reserve(1000)時,向量實際上可能會為1000個以上的元素分配空間。 如果發生這種情況,並且您恰好存儲了1000個元素,則未使用的空間將保持未使用狀態(不會取消分配)。

語義上增加向量的大小( resize / assign / push_back / etc)與物理上創建更多基礎內存以使其擴展為( reserve )之間的區別。

您看到您的代碼即使reserve也能正常工作,這僅僅是因為您沒有觸發任何操作系統內存錯誤(因為內存屬於您的向量),而僅僅是因為您沒有看到任何錯誤消息或崩潰並不意味着您的代碼是安全或正確的:就向量而言,您正在寫入屬於它的內存,而不是您。

如果您使用.at()而不是[] ,則將出現異常; 實際上,您只是在調用undefined behavior

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM