2013-06-19 43 views
0

我想實現一個函數,可以增加任何數據類型的動態數組的大小,讓數組保留所有的數據。一個函數來調整任何動態數組

我想這樣做,因爲我們經常需要在課堂上爲實際項目使用和調整動態數組的大小,所以盡我所能,我不能使用矢量。

我首先想知道這是否可以完成,如果有的話,如果有人能告訴我怎麼做。

這是我到目前爲止。

template <typename Temp> 
void incArraySize(Temp * dynamicArray, int i_Elements) 
{ 
    Temp * dummyArr = new Temp [i_Elements]; 
    for (int l = 0; l < i_Elements; l++) 
     dummyArr[l] = dynamicArray[l]; 

    delete [] dynamicArray; 
    dynamicArray = new Temp [i_Elements+1]; 

    for (int l = 0; l < i_Elements; l++) 
     dynamicArray[l] = dummyArr[l]; 

    delete [] dummyArr; 
} 

也能正常工作的第一次函數被調用,但我得到一個訪問衝突後續倍。

回答

1

dynamicArray應該通過引用傳遞,

void incArraySize(Temp*& dynamicArray, int i_Elements) 

否則在線路dynamicArray = new Temp [i_Elements+1];重新綁定將不會被該函數的外部施加。

也就是說,當你調用

int* array = new int[10]; 
incArraySize(array, 10); 
// line 3: 
std::cout << array[0]; 

在3行中,數組已經刪除[]編由incArraySize,但array變量仍然指向這個老,刪除陣列。這就是您訪問違規的原因。


你有沒有考慮std::vector<Temp>呢?標準庫類型可以正確管理內存和大小,並且使用起來更加簡單。

+0

非常感謝。我絕不會一個人得到這個。我想我仍然有一些關於指針和引用的研究,因爲這些主題對我來說仍然有點模糊。 –

1

將數組大小增加一個將會非常低效,特別是如果您需要多次執行此操作。我會建議犧牲一些內存和使用更多的空間比你需要,或使用列表,你可以使用.push()方法

在你目前的方法,它看起來像你是複製指針到新的數組,而不是將虛擬數組中的各個值複製到動態數組,請嘗試使用for循環內的新關鍵字,以確保每次複製數據時都傳遞數據。

0

爲什麼選擇兩個副本? KennyTM指出您需要參考:

template <typename Temp> 
void incArraySize(Temp *& dynamicArray, int i_Elements) 
{ 
    Temp * p = new Temp[i_Elements + 1]; 

    for (int l = 0; l < i_Elements; l++) 
     p[l] = dynamicArray[l]; 

    delete [] dynamicArray; 

    dynamicArray = p; 

}