2011-04-12 54 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