【问题标题】:How to create a 2D array in C++? [duplicate]如何在 C++ 中创建二维数组? [复制]
【发布时间】:2019-12-29 03:02:54
【问题描述】:

好的,这个问题似乎很愚蠢,但请耐心等待。当我尝试在 C++ 中创建一个二维数组时,它给了我一些警告(len 是一个整数):

double a[len][len];
// warning: variable length arrays are a C99 feature
// warning: variable length array used

所以我尝试了另一个:

double **a = new double[len][len];
// error: only the first dimension of an allocated array may have dynamic size
// read of non-const variable 'len' is not allowed in a constant expression

如何在C++11 中正确操作?

【问题讨论】:

  • std::vector<std::vector<int>> a(len, std::vector<int>(len));
  • 数组尺寸必须保持不变。一些编译器将允许第一段代码更像 C。不过,这是一种将顶部从堆栈中吹走的绝妙方法。如果您事先不知道尺寸,我建议您使用something more like this。您仍然可以获得连续存储,但它位于动态存储中,通常您拥有更多内存。
  • 有很多方法可以通过不同的权衡来做到这一点。

标签: c++ arrays c++11


【解决方案1】:
double** a=new double*[len];
for(int i=0;i<len;++i)
{
   a[i]=new double[len];
}

【讨论】:

  • 也许在销毁部分上做一个注释,让它替换自动的double a[len][len]; 变量会很好。这样一来,使用智能指针——最终std::vector 来代替所有繁琐的内存管理。
  • 我建议覆盖销毁逻辑以确保完整性,因为清理此选项并非易事。
  • 这是分配具有统一列数的动态二维数组的最坏方法。它有很多问题 - 内存碎片,如果其中一个 new[] 调用失败,则很难诊断错误等等。
  • 如果你添加内存释放,我会投赞成票。
【解决方案2】:

对您可以使用的内容有任何限制吗?如果您打算进行数组操作,我会说只需使用 [Eigen] (http://eigen.tuxfamily.org/index.php?title=Main_Page)

【讨论】:

  • 这将是一个很好的评论,但作为一个答案它很弱。
  • 是的,我不想使用std::vector
  • 而且我认为额外的 3rd 方库是不必要的。
  • @ycao -- 你为什么不想使用std::vector?它是自 1998 年以来 C++ 标准库的一部分。还有哪些其他 C++ 库函数您也不愿意使用?
  • @TedLyngmo 我认为你是对的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
相关资源
最近更新 更多