【发布时间】:2016-05-21 05:34:48
【问题描述】:
我有一个结构,根据运行时的用户输入,它需要 1D 数组或 3D 数组。它永远不需要两者。现在,我像下面的示例代码一样设置了它,带有可以指向 1D 数组或 3D 数组的单独变量。我希望结构中只有一个变量可以指向 1D 数组或 3D 数组,其中维度是在运行时设置的。我有 C 的中级知识,并且是 C++ 的初学者。我愿意接受基于 C++ 概念的答案,但 仅 与在迭代值时使用 C 相比没有减速(或减速可忽略不计)。如果它是一个 3D 数组,那么访问和更改数组值的 for 循环是我代码中的最大瓶颈。数组设置好后,我不需要更改数组的维度或大小。
有没有办法做到这一点,还是我应该满足于在我的结构中总是有一个无关的变量?
#include <iostream>
using namespace std;
typedef struct {
int dim;
int *one_d_arr;
int ***three_d_arr;
} Struct;
int main() {
int count = 0;
int *arr1 = (int*) malloc(2 * sizeof(int));
arr1[0] = 0;
arr1[1] = 1;
int ***arr3 = (int***) malloc(2 * sizeof(int**));
for (int i=0; i<2; i++) {
arr3[i] = (int**) malloc(2 * sizeof(int*));
for (int j=0; j<2; j++) {
arr3[i][j] = (int*) malloc(2 * sizeof(int));
for (int k=0; k<2; k++) {
arr3[i][j][k] = count++;
}
}
}
Struct s;
s.one_d_arr = NULL;
s.three_d_arr = NULL;
cout << "Enter number of dimensions: ";
cin >> s.dim;
if (s.dim==1) {
s.one_d_arr = arr1;
cout << s.one_d_arr[0] << ", " << s.one_d_arr[1] << endl;
}
else if (s.dim==3) {
s.three_d_arr = arr3;
cout << s.three_d_arr[0][0][0] << ", " << s.three_d_arr[0][0][1] << endl;
cout << s.three_d_arr[0][1][0] << ", " << s.three_d_arr[0][1][1] << endl;
cout << s.three_d_arr[1][0][0] << ", " << s.three_d_arr[1][0][1] << endl;
cout << s.three_d_arr[1][1][0] << ", " << s.three_d_arr[1][1][1] << endl;
}
else {
cout << "Must enter 1 or 3" << endl;
}
}
【问题讨论】:
-
我想你可能想在 C++ 中使用
new(而不是malloc)。 -
指针不是数组!您的问题中没有 3D 数组。成为 C 或 C++ 的 3 星级程序员可不是恭维!
-
在 C++ 中,变量的类型必须在编译时固定。数组的维度是其类型的一部分。所以从字面上看,答案是否定的。然而,实际上有很多方法可以解决这个问题。 (1) 始终将其设为一维数组(或者更好的向量可能!),并使用布尔标志来指示您应该如何处理/遍历它。 (2) 有两个不同的struct,获取数据时在它们之间进行选择。
-
首先,使用您的类型的代码将在编译时决定如何使用它,但不同维度的语法不同。那么,如果您使用具有 1D 语法的 3D 数组会发生什么?由于它是同一类型,编译器将无法检测到这一点。我认为您的方法存在缺陷,也许退后一步并描述您的问题会有所帮助。此外,请阅读 C++ 教程。你的代码犯了一堆正确的学习应该能够避免的错误。
-
set array size at runtime == std::vector
标签: c++ arrays multidimensional-array struct