数组操作

| 因此,我试图避免使用向量来做到这一点,我知道这样做会更容易,但是我试图更好地理解指针和数组。那么有没有一种方法可以在不使用向量的情况下扩展和移位数组呢?这是我到目前为止所拥有的:
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;

}
    
已邀请:
由于您没有在函数内更改
arr
的值,因此无需通过引用传递地址。如果确实要更改该值,则需要在返回newArray之前添加新的代码行:
arr = newArray;
如果典型的呼叫方式是
arr = expand(arr, arr_size);
那么您还需要注意忽略别名的选项。而且,您必须假设在
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;
}
如果您使用的是
malloc
free
而不是
new []
delete []
,则可以使用
realloc
。     
执行所需操作的最简单方法是标准库函数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 *中找到(它是相同的指针,或者内容已被复制)。有关详细信息,请参见链接。     
在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;
}
    
要手动执行此操作,您需要复制具有原始数组大小的旧数据,现在您正走出原始数组的末尾。 尝试这个:
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;
}
    
您分配的内存是所需的两倍。 您不会删除旧数组。 您没有将新指针分配给
arr
-将其作为参考传递就表明了您的意图-或您打算向
delete[]
arr分配0。     
有关使用memcpy而不是遍历单个项目的方法,请参见此链接。
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;
}
    

要回复问题请先登录注册