【问题标题】:Initialize a 2d array with unknown first dimension size in C++在 C++ 中初始化具有未知第一维大小的二维数组
【发布时间】:2023-04-11 08:34:02
【问题描述】:

假设我需要一个二维数组,第一维大小在运行时设置,第二维大小在编译时设置为 5。

因为我们可以这样做来初始化一个未知大小的一维数组

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

我想让下面的代码工作

int* arr[5];
arr = new int[12][5];

注意:

我需要将第二个维度设置为 5,而不是第一个维度。所以我需要能够做到arr[11][4] 而不是arr[4][11]

我知道我可以将arr 设为int**,然后将二维数组分配给arr,所以请避免这样的答案。

我知道我可以使用vector等STL容器,所以请避免这样的回答。

【问题讨论】:

  • I know I can make arr an int** and then assign a 2d array to arr, so please avoid such answer. -- 为什么? -- I know I can use STL containers such as vector, so please avoid such answer. -- 为什么?
  • 我知道用螺丝刀可以拧螺丝,所以请避免这样的回答
  • 问题中有很多“我知道”。- 究竟是什么问题?
  • 既然我们可以这样做来初始化一个未知大小的一维数组——我认为这是对二维数组可以做什么的误解开始的地方。跨度>
  • 这不是大多数 C++ 程序员用来声明二维动态数组的惯用语。混淆可以只用两行代码——行数无关紧要。

标签: c++ arrays c++11 pointers multidimensional-array


【解决方案1】:

你可以写:

int (*arr)[5];

arr = new int[12][5];

然后您可以访问诸如arr[11][4] 之类的元素。但不是arr[12][5],正如您在问题中所建议的那样,数组是零索引的,最大元素索引比维度小一。

除了最里面的所有维度都必须在编译时知道。如果 5 实际上是用来表示运行时值,那么您不能在此任务中使用 C 样式的数组。

注意。考虑使用unique_ptr 进行安全内存管理。代码为auto arr = std::make_unique<int[][5]>(12);

【讨论】:

  • 顺序不重要?是那个还是这个: int (*arr)[12];真的吗?
  • @nonock 我的代码有 12 行和 5 列。您的建议是 12 列
猜你喜欢
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 2020-10-11
  • 2014-09-02
  • 2012-04-06
  • 2021-04-04
  • 2014-10-31
  • 1970-01-01
相关资源
最近更新 更多