2016-03-31 92 views
-3

我想声明多维(INT他的情况下二维)数组。我无法声明全局数组的大小。与一个维,一切正常:C++多维指针无需声明

#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,创建矢量数组或在主函数中声明

+0

你为什么不使用'std :: vector'而不是担心这个? – Barmar

回答

0

What is my option apart from declaring number instead of N and M, creating vector array or declaring table in main function?

N指针分配内存。
对于每个指针,为类型的元素分配内存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)); 
0

使用做事的旧方式:分配一维阵列并随后通过执行计算(I * N + j),通过唯一的索引访问它。如果你想隐藏它,用两个参数创建一个函数。

0

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

int N=2, M=3; 
bool *table = new bool[N*M]; 

// to access the element at (n,m): 

ele = table[n*M + m]; 

这使得所有的分配/释放具有的轻微代价死的简单键入多一点的时候访问元素。当然,您可以使用宏来解决这个问题。