2014-01-12 56 views
0

有人可以向我解释为什么这段代码不起作用,我该如何解决它? 谢谢声明一个未知大小的多维数组

int main() 
    { 
    int gridSize; 
    cout<<"please enter the grid size: "; 
    cin>>gridSize; 
    int gridArray[gridSize][gridSize]; 
    } 
+1

在C++中,你有['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)。用它。 –

+0

它不起作用,因为C++不包含VLA。要解决它,使用'std :: vector'和一个小包装器来支持2D寻址。 http://stackoverflow.com/a/12009991/179910 –

+0

https://groups.google.com/forum/#!topic/comp.std.c++/K_4lgA1JYeg – Maroun

回答

3

使用std::vector<int>(rows * cols)甚至std::vector<std::vector<int>>()。它不起作用,因为C++不支持VLA。在即将到来的技术规范中将会提供std::dynarray

+0

好的,非常感谢:) – Alladin

0
class Table 
{ 
public: 
    Table(int rows, int cols) 
    { 
     tab_.resize(rows); 
     for (auto& row : tab_) 
     { 
      row.resize(cols); 
     } 
    } 

    vector<int>& operator[](int row) { return tab_[row]; } 
private: 
    vector<vector<int> > tab_; 
}; 
+0

我真的很想理解为什么它被拒绝投票,因为如果我需要一张桌子,我会这么做。 – Ezra

+0

1)OP没有要求一个表,也没有一个类,而只是一个动态调整大小的多维数组。这是一个非常详细的解决方案。2)在一个常规用例中,我永远不会为这个写一个额外的类if它不是一个核心功能(例如对于数据库库),但直接在我的实现中操作矢量(这隐藏了这个方面).3)如果我编写这样一个类,我将它设计为模板,使其支持任意并且可以通过一个单独的向量或字节缓冲区来实现它。这里的要点很简单:1):没有问,太详细,但同时也是一般的 – Paranaix

2

std::vector是做类似的东西常用的手段,但如果你手工是在明知只关心如何把它:

int main() 
{ 
    int gridSize; 
    std::cout << "Enter size of grid: "; 
    std::cin >> gridSize; 
    int** gridArray = new int*[gridSize]; 
    for (int i = 0; i < gridSize; i++) 
    { 
     std::cout << std::endl << i << std::endl; 
     gridArray[i] = new int[gridSize]; 
    } 
} 

基本上,你正在使用指针数组的指针,然后设置第二个维度。但是,如果你这样做,你将不得不手动delete的内存,以避免泄漏。 再次,这种方式不建议,只提供技术诀窍

Parashift's C++ FAQ为任何新的/适中的C++程序员一个很好的资源。

+0

确定thx对于你的帮助很大,并且为了给我这样的有用的信息 – Alladin