2011-09-21 106 views
0

所以我有一個名爲數字的數組,具有動態分配的內存。初始容量設置爲20的默認容量。我試圖找出如何實現下面的代碼,以便如果將某些內容添加到超出容量的數組中,代碼將創建一個2^n的新數組更大(即40,80,160)。但是我希望它有一個for循環,這將使數組2^n更大,直到新容量大於輸入的數量。如何將動態內存分配數組的大小調整爲特定值?

void BigNum::resize(size_t n) 
{ 
size_t *NEW_CAPACITY; 

if(n == capacity) 
    return; // The allocated memory is already the right size 

if(n < used) 
    n = used; 

NEW_CAPACITY = new size_t[n]; 
copy(digits, digits + used, NEW_CAPACITY); 
delete[] digits; 
    digits = NEW_CAPACITY; 
capacity = n; 

任何幫助深表感謝

+4

爲什麼你不使用'std :: vector' –

+4

爲什麼你不使用'std :: vector',會自動執行這樣的事情? – nabulke

+0

因爲我必須以這種方式去解決它的一個要求。我寫的基本上是我想要做的,我只需要一個for循環來調整NEW_CAPACITY數組,直到它大於輸入內容。我需要弄清楚如何在每個循環中使數組大小增加2^n – Sean

回答

0

如果您使用C++語法編寫C代碼 - 然後使用C方法:reallocmalloc

如果你正在編寫C++代碼 - 使用std::vector而不是數組。

循環你指的是一個簡單的計算:

while(current<required) { 
    current = 2*current; 
} 
new_digits = realloc(digits, current); 
// check that the allocation succeeded, handle errors, no need 
// to copy data - realloc does that for you. 

完成。

+0

我必須將數組作爲項目的一部分。我想要弄清楚的是,如果數組的每個部分都對應一個較大數字的數字,並且較大數字超過了默認容量20,那麼處理大數字。然後,數組的大小應調整爲2^n默認情況下,直到新的容量大於那麼大的數字 – Sean

+0

爲什麼你在內部循環中調用'realloc'?另外,你寫的方式使得從'realloc'中的失敗恢復是不可能的(如果'realloc'失敗,'digits'的舊值將會丟失,並且會發生泄漏)。 – Idelic

+0

@Idelic - 儘管我通常會忽略這樣的迂腐評論,但在我看來,OP沒有足夠的能力來複制我的例子,所以我會糾正它。 – littleadv

0

「我試圖弄清楚如何實現下面的代碼,以便如果超出容量的數組添加了一些東西,代碼將創建一個2^n更大的新數組(即40,80 ,160),但我希望它有一個for循環,這將使數組2^n更大,直到新的容量大於輸入的數量。

首先,我認爲你的意思是2 * n而不是2^n。

其次,爲什麼不像其他評論者說的那樣使用std :: vector?

第三,我不完全明白你的問題,但它聽起來像你想的:

int newCapacity = capacity; 
while(newCapacity < n) 
    newCapacity *= 2; 

這似乎是很瑣碎的,所以你可以澄清你的問題?

相關問題