在初始化我的2d矩阵后动态增加行数

时间:2017-05-14 11:09:22

标签: c++ arrays dynamic

我有一个问题,似乎没有在这个网站或其他人回答,我对这些事情相当新,所以这是我在网站上的第一个问题。我想在我的2d数组中添加行,每次用户输入字符'a''l'(添加行),然后他将在这两个字符后输入数字。 (这样做了几次)这意味着每次用户输入'al'后行的长度都会增加。我如何初始化一个矩阵,我不知道它可能有多少行?然后在编译时添加行

我的问题是,一旦我将行初始化为特定长度,我该如何改变行的长度,或者甚至是可能的?

1 个答案:

答案 0 :(得分:1)

您可以使用数据结构vector,它允许在需要时动态更改其大小。下面是一个简单的示例,其中使用向量的push_back方法将新行添加到现有的二维数组中。您可以阅读有关vector here的更多信息。

int main()
{
    std::vector<std::vector<int>> vec{{1, 2, 3}, {4, 5, 6}}; // Initializes a 2x3 array

    vec.push_back({7, 8, 9}); // Adds a new line to the array

    for (int i = 0; i < vec.size(); i++)
    {
        for (int j = 0; j < vec[i].size(); j++)
        {
            std::cout << vec[i][j];
        }

        std::cout << "\n";
    }

    return 0;
}

或者,您可以为您的阵列动态分配内存,但这有几个缺点。 C ++数组是固定大小的,调整大小的唯一方法是创建一个新数组,将旧数组复制到其中,删除旧数组并继续工作。这可能会很快变得凌乱,我建议反对它。连续复制和内存分配是非常有效的操作。如果你绝对必须避免使用向量,那么我建议声明一个足够大的数组来容纳你的用户可以添加的所有行,然后只有一个计数器来标记当前使用的行数。这是一个如何声明动态二维数组的快速示例。

int main()
{
    int m = 2; // Number of rows
    int n = 3; // Number of columns

    int **arr = new int*[m];

    for (int i = 0; i < m; i++)
    {
        arr[i] = new int[n];
    }

    // Continue with your work

    return 0;
}

更重要的是,使用new分配的所有内容都必须使用delete取消分配。

for (int i = 0; i < m; i++) // Memory cleanup
{
    delete arr[i];
}

delete[] arr;