2014-04-28 158 views
0
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循環內正常運行。不知何故,當我使用print.size()打印出來時,它始終爲0.是否保留不分配任何空間?指定矢量大小vs保留矢量大小

+0

最後一個問題是一個非限制性問題。是的,'reserve'分配空間,但不會在容器中創建元素。 –

+0

當我們不知道大多數變量的類型時,嘗試跟隨代碼有點難。 – PlasmaHH

回答

3

它被指定爲

void reserve(size_type n);

效果:,通知在尺寸的變更預定的 矢量,以便它可以相應地管理存儲 分配A指令。在reserve()之後,如果重新分配發生,capacity()更大或等於reserve的參數;並等於 之前的capacity()的值,否則。當且僅當當前容量小於reserve()的參數 時,在此點重新分配 。如果除非由非CopyInsertable類型的移動構造函數引發異常 ,則不會有效果。

複雜度:它不會改變序列的大小,並且在序列大小的最大線性時間中取值爲 。

所以,是的,它分配內存,但它不會在容器內創建任何對象。爲了在隨後想要的矢量中創建儘可能多的元素,並且能夠通過op[]訪問它們,您需要致電resize()

reserve()適用於當您想要防止類似於矢量重新分配之類的事情時不時地做大量push_back() s。

2

reserve分配空間,但並沒有真正創造任何東西。它用於避免重新分配。

例如,如果您打算存儲10000個元素,通過將push_back插入到一個向量中,您可能會使該向量使用重新分配。如果您在實際存儲元素之前使用了儲備,那麼該矢量準備接受大約10000個元素,因此他準備好了,並且矢量的填充速度應該比沒有使用儲備更快。

resize,實際上創造空間。還要注意,調整大小會將你的元素初始化爲它們的默認值(所以對於一個int,它將設置每個元素爲0)。實際上,當你說reserve(1000)時,那麼vector實際上可能會爲1000多個元素分配空間。如果發生這種情況,並且您存儲了1000個元素,則未使用的空間將保持未使用狀態(不會解除分配)。

2

它是語義之間增加載體(resize/assign/push_back /等)的大小,並且物理創造更多底層內存爲它擴展成(reserve)之差。

,你看到你的代碼甚至出現與reserve工作僅僅是因爲你沒有觸發任何操作系統內存錯誤(因爲內存是屬於你的載體),而是因爲你沒有看到任何錯誤消息或崩潰並不意味着你的代碼是安全或正確的:就矢量而言,你正在寫入屬於的內存,而不是你。

如果您使用.at()而不是[]您會遇到異常; 原樣,您只是調用未定義的行爲