声明一个大小未知的多维数组

Posted

技术标签:

【中文标题】声明一个大小未知的多维数组【英文标题】:declaring a multidimensional array with unknown size 【发布时间】:2014-01-12 13:52:01 【问题描述】:

有人可以向我解释为什么这段代码不起作用,我该如何解决? 谢谢你

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

【问题讨论】:

在 C++ 中你有std::vector。使用它。 它不起作用,因为 C++ 不包含 VLA。为了解决这个问题,使用带有小包装器的std::vector 来支持二维寻址。 ***.com/a/12009991/179910 groups.google.com/forum/#!topic/comp.std.c++/K_4lgA1JYeg 请习惯于解释你看到的结果,而不是仅仅说“它不起作用”。 【参考方案1】:

使用std::vector&lt;int&gt;(rows * cols) 甚至std::vector&lt;std::vector&lt;int&gt;&gt;()。它不起作用,因为 C++ 不支持 VLA。即将发布的技术规范中将提供std::dynarrays。

【讨论】:

【参考方案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++ 程序员来说都是一个很好的资源。

【讨论】:

非常感谢您的帮助,并为我提供了如此有用的信息【参考方案3】:
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_;
;

【讨论】:

我真的很想知道为什么它被否决了,因为如果我需要一张桌子,我会这样做。 1) OP 没有要求一个表,也没有一个类,而只是要求一个动态大小的多维数组。这是 IMO 一个非常详细的解决方案。2) 在常规用例中,我永远不会如果它不是核心功能(例如,用于数据库库),则为此编写一个额外的类,但在我的实现中直接对向量进行操作(隐藏了这一方面)。3)如果我编写这样一个类,我会将其设计为模板,使其支持任意数量的维度,并用单个向量或字节缓冲区适当地实现它。这里的要点很简单 1):没有问,太详细但同时又太笼统

以上是关于声明一个大小未知的多维数组的主要内容,如果未能解决你的问题,请参考以下文章

表示为一维的多维数组(模板化为 n 维)

如何在运行时分配多维数组?

Java--数组概述 & 数组创建和声明 & 数组使用 & 多维数组

具有未知键数的多维数组上的PHP Array_intersect

多维数组

使用多维字符串数组写入文件