没有声明的C++多维指针数组

C++ multi dimensional array of pointers without declaration

本文关键字:指针 数组 C++ 声明      更新时间:2023-10-16

我想声明多维(在这种情况下是二维的)数组。我无法声明全局数组的大小。有了一维,一切都可以工作:

#include <iostream>
#include <fstream>
using namespace std;
int N, M;
bool *table;
int main()
{
    ifstream in ("in.txt");
    in >> N >> M;
    table = new bool[N];
    return 0;
}

但如果我想声明二维数组,我会得到一个错误:'M'不能出现在常量表达式中

#include <iostream>
#include <fstream>
using namespace std;
int N, M;
bool **table;
int main()
{
    ifstream in ("in.txt");
    in >> N >> M;
    table = new bool[N][M];
    return 0;
}

除了在主函数中声明数字而不是N和M、创建向量数组或声明之外,我的选项是什么?

除了在主函数中声明数字而不是N和M、创建向量数组或声明表之外,我的选择是什么?

N指针分配内存
对于每个指针,为bool类型的M元素分配内存。

table = new bool*[N];
for (int i = 0; i < N; ++i )
{
   table[i] = new bool[M];
}

当需要解除分配时,使用:

for (int i = 0; i < N; ++i )
{
   delete [] table[i];
}
delete [] table;

使用std::vector可以避免内存分配和释放的所有麻烦。

std::vector<std::vector<bool>> table(N, std::vector<bool>(M));

使用旧的方法:分配一个一维数组,然后通过计算(i*N+j)通过唯一索引访问它。如果你想隐藏它,创建一个有两个参数的函数。

如果你想避免真正的多级阵列的所有麻烦,你可以:

int N=2, M=3;
bool *table = new bool[N*M];
// to access the element at (n,m):
ele = table[n*M + m];   

这使得所有的分配/解除分配都非常简单,只需在访问元素时多键入一点即可。当然,你可以用一个宏来解决这个问题。