2011-04-12 53 views
1

所以我試圖避免使用向量來做到這一點,我知道它會使它更容易,但我想更好地理解指針和數組。那麼有沒有辦法在不使用矢量的情況下擴展和移動數組?這是我到目前爲止:數組操作

int *expand(int *&arr, int size) 
{ 
    int *newArray; 

    size = size * 2; 

    newArray = new int[size * 2]; 
    for (int index = 0; index < size; index++) 
     newArray[index] = arr[index]; 
    return newArray; 

} 
+0

嗨,你需要使用4個空格縮進所有代碼,這樣它纔會在問題中正確顯示:) – x10 2011-04-12 20:09:19

+0

我沒有在其中看到任何矢量? – Pete 2011-04-12 20:10:59

+1

您正在分配** 4 **倍的大小,這是你想要的嗎? – 2011-04-12 20:39:13

回答

0

既然你不改變函數內部的arr價值,有不需要通過引用來傳遞地址。如果你沒有意思更改該值,則需要返回newArray之前添加新的代碼行:

arr = newArray; 

如果典型調用模式是

arr = expand(arr, arr_size); 

,那麼你還需要注意忽略aliasing的選項。而且你必須在expand範圍內做出假設,其大小總是翻倍,並在其外面跟蹤自己。

此外,您的代碼有一個可怕的錯誤。大小加倍,然後用作源數組的數組限制。然後它泄漏先前分配給arr的內存。這是人們使用std::vector的好理由。 :-)到目前爲止,大部分的漏洞都已經不在這個庫中。

void expand_in_place(int *&arr, int& size) 
{ 
    const new_size = size * 2; 
    int *new_array = new int[new_size]; 

    for (int index = 0; index < size; index++) 
     new_array[index] = arr[index]; 

    delete[] arr; 
    arr = newArray; 
    size = new_size; 
} 

如果您使用mallocfree代替new []delete [],你可以使用realloc

3

最簡單的方法來做你想做的就是標準庫函數realloc。
http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

int* new_array = (int*) realloc (old_array, new_size * sizeof(int)); 

注意*的sizeof(int)的。這很重要:)
realloc確保* old_array *的內容可以在* new_array *中找到(它可以是相同的指針,也可以是複製的內容)。詳情請參閱鏈接。

+4

請注意,'realloc'內存*不能被'new'獲得,並且不能用'delete'釋放。這是非常C-ISH,不叫建設者等。 – GManNickG 2011-04-12 20:14:38

+1

準確地說。如果你想讓它成爲C++ - ish,你可以使用向量:) – x10 2011-04-12 20:19:26

+0

@ x10:好吧,不是真的,'vector' * does *需要以某種方式實現,並且它不使用'realloc'。 – GManNickG 2011-04-12 20:22:02

1

要做到這一點手動,你需要複製舊數據與原始數組的大小,現在你走了原始數組的末尾。

試試這個:

int *expand(int *&arr, int size) 
{ 
    int *newArray; 

    newArray = new int[size * 2]; 
    for (int index = 0; index < size; index++) 
     newArray[index] = arr[index]; 
    return newArray; 
} 
1
  • 你,因爲你需要分配兩倍的內存。您不刪除舊的數組。
  • 您不會將新指針指定爲arr - 將其作爲參考傳遞給您,表明您的意圖是 - 或者您打算將delete[]設爲arr並將0賦值給它。
+0

那麼,如果我想用元素初始化數組中的新空間,例如如果我打印出新數組,數組中的新空格中有數字呢? – Shimar 2011-04-13 04:32:46

+0

@Smar:保持循環初始化 – Erik 2011-04-13 05:03:57

1

對於使用的memcpy,而不是通過個別項目循環的方法見本link

int *expand(int *&arr, int size) 
{ 
    size_t newSize = size * 2; 
    int* newArr = new int[newSize]; 

    memcpy(newArr, arr, size * sizeof(int)); 

    size = newSize; 
    delete [] arr; 
    arr = newArr; 
} 
+0

memcpy也不關心構造函數/析構函數 – 2011-04-12 20:17:03

+0

他有一個整數數組,這有什麼關係嗎? – 2011-04-12 20:17:50

+0

在這種情況下 - 沒有。一般來說 - 重要的是 – 2011-04-12 20:19:34

3

在C++中,儘量避免原始指針。但由於這是一個鍛鍊,這是一個C++的方式:

int *expand(int *&arr, int size) 
{ 
    int *newArray = new int[2*size]; 

    std::copy(&arr[0],&arr[size], &newArray[0]); 
    // delete [] arr; // need to delete? 

    return newArray; 
} 

到位,做到:

void expand(int *&arr, int size) 
{ 
    int *newArray = new int[2*size]; 

    std::copy(&arr[0],&arr[size], &newArray[0]); 
    delete [] arr; 

    arr = newArray; 
} 
+0

也許在這種情況下int *&arr應該只是一個int * arr? – x10 2011-04-12 20:28:55

+0

@ x10請參閱編輯如何做到位。無需返回任何東西 – 2011-04-13 06:26:22