我一直不愿在C ++中创建动态2D数组,而在C ++中不使用new。我已经尝试了一段时间使某项工作正常,但是我对应该做的事情一无所知。
编辑:抱歉,应该更具体一些。只是为了透明起见,是的,这是家庭作业,不,我不希望解决它,我只是想指出正确的方向(无双关语),自己编写代码。
该命令供参考,如下所示:开发一个控制台应用程序,以使用指针创建大小为 m x n 的类型int
的矩阵。用户必须从键盘输入矩阵大小的值,并且矩阵内容必须是随机生成的(1-100)。然后,必须计算并显示矩阵的转置(创建类是必要的)。
我们不能使用new,也不可以使用vector,因为我们只能通过带有一维数组的指针来进行操作。到目前为止,我创建了一个代表“行”的类,以及另一个代表“列”的类。列进入行,行进入另一个称为矩阵的类。那是个主意,但在实施时遇到了麻烦。
答案 0 :(得分:4)
new
是在标准C ++中创建动态对象或数组的唯一方法。因此,根据您如何解释任务,可以认为它是不可能的。
如果我们假设可以调用内部调用new
的标准函数,那么该问题可以解决。在C ++中创建动态数组的一种常用方法是使用std::vector
。 std::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;
}
}