调整2D动态分配

时间:2014-12-12 02:51:27

标签: c++ arrays dynamic matrix resize

你能帮我改变动态分配的2D阵列的大小吗?我需要功能改变当前数组大小所需的大小。我发送我的代码为例。感谢

    int main()
    {
        //create array col x row
        int **array = new int*[col];
        for (int i = 0; i < col; i++)
        {
            array [i] = new int[row];
        }

        //add numbers to array
        for (int i = 0; i < col; i++)
        {
            for (int j = 0; j < row; j++)
            {
                pole[i][j] = i*j;
            }
        }

        /*
        call function for change size of matrix ...
        for example row to rov+5 and col to col+1 without loss of data
        */

        //free memory
        for (int i = 0; i < col; i++)
        {
            delete[] pole[i];
        }
        delete pole;
    }

    void resize(int ** & arr)
    {
        //code
    }

3 个答案:

答案 0 :(得分:1)

我不确定你想在这里完成什么。可能最简单的方法是在删除之前将旧矩阵复制到较大的矩阵中。如果要真正重新分配内存,并避免使用c ++提供的更复杂的结构,可以使用#include<cstdlib>realloc()所有需要的行和列。但这不被认为是c ++风格。

更多信息:http://www.cplusplus.com/reference/cstdlib/realloc/

答案 1 :(得分:0)

这是未经测试的,但希望能给你一些想法;

void create(int ** & arr)
{
    //create array col x row
    arr = malloc(col * sizeof(int*));
    for (int i = 0; i < col; i++)
    {
        arr [i] = malloc(row * sizeof(int));
    }
}

void destroy(int ** & arr)
{
    for (int i = 0; i < col; i++)
    {
        free(arr [i]);
    }
    free(arr);
}

void resize(int ** & arr,int new_col,int new_row)
{
    if (new_col == col)
    {
        if (new_row == row)
            return;
        for (int i = 0; i < col; i++)
        {
            arr [i] = realloc(arr [i],new_row * sizeof(int));
        }
    }
    else if (new_col > col)
    {
        arr = realloc(arr,new_col * sizeof(int*));
        if (new_row != row)
        {
            for (int i = 0; i < col; i++)
            {
                arr [i] = realloc(arr [i],new_row * sizeof(int));
            }
        }
        for (int i = col; i < new_col; i++)
        {
            arr [i] = malloc(arr [i],new_row * sizeof(int));
        }
    } 
    else 
    {
        if (new_row != row)
        {
            for (int i = 0; i < new_col; i++)
            {
                arr [i] = realloc(arr [i],new_row * sizeof(int));
            }
        }
        for (int i = new_col; i < col; i++)
        {
            free(arr [i]);
        }
        arr = realloc(arr,new_col * sizeof(int*));
    }
    col = new_col;
    row = new_row;
}

答案 2 :(得分:0)

我会创建一个具有所需大小,正确行数和正确列数的矩阵,复制旧矩阵的内容并执行新行和新列所需的操作,然后取消分配旧矩阵。