gpt4 book ai didi

c++ - 如何访问具有多个括号的一维数组以提高可读性?

转载 作者:可可西里 更新时间:2023-11-01 16:35:25 25 4
gpt4 key购买 nike

我有一个巨大的代码,使用一个由指针管理的 3D 数组。像这样的东西:

int *** tab;
tab = malloc(m*sizeof(int**));
for(i= 1..n) tab[i] = malloc(n*sizeof(int*));
... etc...

之后可以通过以下方式访问元素:

tab[i][j][k] = ...

但由于此结构的特定问题,我想将 tab 声明为连续数组,但在代码中仍使用带有 3 个括号的语法。编译器将在内部像这样替换它们:

tab[i][j][k] = ...  =>  tab[i*m*n+j*m+k] = ...

所以只用一个指针解引用访问数组。我不想更改源代码(没有 sed)。

例如,我可以通过在堆栈中声明选项卡来做到这一点:

int tab[n][m][l];

但不幸的是,如果 mn 是运行时变量,这将不起作用。

最佳答案

C++ 方法是将 3D 数组包含在一个类中以具有自然访问器:

struct Arr3D
{
int *arr;
const int n, m, p; //size of the tab in 3 dimensions

public:
Arr3D(int n, int m, int l): n(n), m(m), p(l) {
arr = new int[n * m * p];
}

~Arr3D() {
delete[] arr;
}

int& val(int i, int j, int k) { // read-write accessor
// optionaly test for 0<=i<n...
return arr[k + p * (j + i * m)];
}
};

您可以简单地创建和使用一个数组:

Arr3D * parr = new Arr3D(3,4,5); // dynamic allocation
Arr3D arr(3, 4, 5); // automatic allocation
...
arr(1,2,3) = 5;
int i = arr(2,0,1);

或者,如果您想保留语法 tab[i][j][k],您可以使用能够提供 View 的辅助 Arr2D 类在二维数组上:

struct Arr2D
{
int *arr;
const int n, m; //size of the tab in 2 dimensions
const bool is_view;

public:
Arr2D(int n, int m): n(n), m(m), is_view(false) {
arr = new int[n * m];
}
Arr2D(int *arr, int n, int m): arr(arr), n(n), m(m), is_view(true) {}

~Arr2D() {
if (! is_view) delete[] arr;
}

int * operator[] (int i) {
return arr + i * m;
}
};

struct Arr3D
{
int *arr;
const int n, m, p; //size of the tab in 3 dimensions

public:
Arr3D(int n, int m, int l): n(n), m(m), p(l) {
arr = new int[n * m * p];
}

~Arr3D() {
delete[] arr;
}

Arr2D operator[](int i) {
return Arr2D(arr + i * p * m, m, p);
}
};

您现在可以简单地使用 arr[i][j][k] ...

关于c++ - 如何访问具有多个括号的一维数组以提高可读性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37463974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com