动态二维阵列,无需使用新的

时间:2019-10-30 17:47:58

标签: c++ arrays

我一直不愿在C ++中创建动态2D数组,而在C ++中不使用new。我已经尝试了一段时间使某项工作正常,但是我对应该做的事情一无所知。

编辑:抱歉,应该更具体一些。只是为了透明起见,是的,这是家庭作业,不,我不希望解决它,我只是想指出正确的方向(无双关语),自己编写代码。

该命令供参考,如下所示:开发一个控制台应用程序,以使用指针创建大小为 m x n 的类型int的矩阵。用户必须从键盘输入矩阵大小的值,并且矩阵内容必须是随机生成的(1-100)。然后,必须计算并显示矩阵的转置(创建类是必要的)。

我们不能使用new,也不可以使用vector,因为我们只能通过带有一维数组的指针来进行操作。到目前为止,我创建了一个代表“行”的类,以及另一个代表“列”的类。列进入行,行进入另一个称为矩阵的类。那是个主意,但在实施时遇到了麻烦。

2 个答案:

答案 0 :(得分:4)

new是在标准C ++中创建动态对象或数组的唯一方法。因此,根据您如何解释任务,可以认为它是不可能的。

如果我们假设可以调用内部调用new的标准函数,那么该问题可以解决。在C ++中创建动态数组的一种常用方法是使用std::vectorstd::vector的元素可能不是数组,因此使用它在技术上不可能实现2D动态数组。一种解决方法是将数组包装在一个类中,然后将该类用作向量的元素。此类数组包装器有一个标准模板:std::array。数组包装器向量的示例:

std::vector<std::array<type_of_element, 10>> name_of_vector(number_of_arrays);

由向量管理的动态数组中的数组元素将具有与2D数组相同的布局。

答案 1 :(得分:2)

malloc达到了目的。这是我用来测试的代码。弄清楚如何编写矩阵循环有点费时费力,但是一旦我掌握了它,我就意识到了它的明显性。

Matriz::Matriz(int numFil, int numCol)
    :numFil(numFil), numCol(numCol)
{
    mat = (int *)malloc(numFil * numCol * sizeof (int));

    int c = 0;

    for(int i = 0; i < numFil; i++)
    {
        for(int j = 0; j < numCol; j++)
        {
            *(mat + i * numCol + j) = ++c;
        }
    }
}

void Matriz::printMat()
{
    for(int i = 0; i < numFil; i++)
    {
        for(int j = 0; j < numCol; j++)
        {
            std::cout << *(mat + i*numCol + j);
        }
         std::cout << std::endl;
    }
}