【发布时间】:2019-09-14 07:26:08
【问题描述】:
数组具有作为连续内存块的良好特性。当使用new 为数组分配内存时,它会返回一个指向连续 内存块的指针。但是,如果我使用new 分配一个矩阵,像这样:
#include <iostream> //std::cin
int main()
{
int n, m;
std::cin >> n >> m;
int** mat = new int*[n];
for (int i = 0; i < n; i++)
mat[i] = new int[m];
//use the matrix in some way
for (int i = 0; i < n; i++)
delete[] mat[i];
delete[] mat;
return 0;
}
这可行,但mat 不指向大小为n * m * sizeof(int) 的连续块。我怎样才能在 C++ 中做到这一点?我只是遵守最新标准(即 C++17),仅此而已。我想要一个不涉及 STL 容器或外部库的答案。
请不要回答有关 C 的问题,因为在 C99 和 C11 中使用可变长度数组很容易做到这一点:
#include <stdio.h> //scanf
#include <stdlib.h> //malloc, free
int main()
{
int n, m;
scanf("%d %d", &n, &m);
//int mat[n][m]; VLA, but I want dynamic
int (*mat)[m] = malloc(n * sizeof *mat);
//use the matrix in some way;
free(mat);
return 0;
}
【问题讨论】:
-
首先,不要自己进行动态分配,而是使用
std::vector。至于你的问题,你可以创建一个n * m元素的向量,并使用算术来访问矩阵中的每个元素。 -
我没有问要不要自己分配,我只是问怎么做。自己分配内存虽然很危险,但与使用像
std::vector这样的 STL 容器相比,它可以随时重新分配自己。 -
@DarkAtom 向量不会随时重新分配。如果
m和n是固定的,并且您创建了m*n元素的向量,则没有理由进一步重新分配,除非您提出要求。 -
如果你想用简单的指针来做这件事,无论是否聪明,出于好奇和学习经验,如果你这么说会有所帮助。因为除非您有其他极其特殊的要求(您需要告诉我们),否则所有“动态数组”问题的解决方案都将是“使用向量”。或者,根据实际问题和用例,“使用库 X”(从名称
mat猜测可能是 OpenCV 或 Eigen 或类似名称)。 -
@Someprogrammerdude 好吧,我的错,我应该说这是一种学习体验,而不是真正的代码。下次我会这样做。对不起