我想声明多维(在他的情况下为二维)数组。我无法声明全局数组的大小。一个维度,一切正常:
#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;
}
但是如果我想声明二维数组,我会收到一个错误: 的&#39; M&#39;不能出现在常量表达式
中#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,创建向量数组或声明表之外,我的选择是什么?
答案 0 :(得分:0)
除了声明数字而不是N和M,在main函数中创建向量数组或声明表之外,我的选择是什么?
为N
指针分配内存
对于每个指针,为M
类型的bool
元素分配内存。
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));
答案 1 :(得分:0)
使用旧方法:分配一维数组,然后通过计算(i * N + j)通过唯一索引访问它。如果你想隐藏它,可以创建一个带有两个参数的函数。
答案 2 :(得分:0)
如果你想避免真正的多级数组的所有麻烦,你可以:
int N=2, M=3;
bool *table = new bool[N*M];
// to access the element at (n,m):
ele = table[n*M + m];
这使得所有的分配/解除分配变得简单,只需要在访问元素时输入更多的代价就可以了。当然,您可以使用宏来修复它。