C++ C++;:如何创建运行时确定大小的成员二维数组

C++ C++;:如何创建运行时确定大小的成员二维数组,c++,c++14,C++,C++14,我试图声明一个指向指针的空指针,在构造内存期间将指针分配给它,并在它上面进行迭代,再次执行赋值,但我缺少了一些东西。我还想知道是否可以用std::array来实现这一点。附上代码: //Cell.h 类单元{ 炭含量; 布尔是自由的; }; //Memory.h #包括“Cell.h” #包括 类内存{ 公众: 内存(标准:大小线,标准:大小线); 私人: 细胞**细胞; }; //Memory.cpp #包括“Memory.h” 内存::内存(标准::大小线,标准::大小线): 单元格(新

我试图声明一个指向指针的空指针,在构造内存期间将指针分配给它,并在它上面进行迭代,再次执行赋值,但我缺少了一些东西。我还想知道是否可以用
std::array
来实现这一点。附上代码:

//Cell.h
类单元{
炭含量;
布尔是自由的;
};
//Memory.h
#包括“Cell.h”
#包括
类内存{
公众:
内存(标准:大小线,标准:大小线);
私人:
细胞**细胞;
};
//Memory.cpp
#包括“Memory.h”
内存::内存(标准::大小线,标准::大小线):
单元格(新单元格[nlines])//无法使用“Cell*”类型的右值初始化“Cell**”类型的成员子对象
{
对于(标准::尺寸i=0;i
此外,我需要数组包含值为“
charcontents=”的单元格,bool在初始化后为_free=true
。哪种方法最好

UPD:我曾想过使用单个指针(不是指向指针的指针)创建一个2D伪数组,并使用
I*ncols+j
访问一个单元格

我还想知道是否可以用std::数组实现这一点

不能,数组的大小被指定为模板参数,而数组的大小是动态调整的

与处理原始指针不同,您应该查看动态大小的数组:

std::vector<std::vector<Cell>> cells{ncols, std::vector{nlines, Cell{}}};
std::vector cells{ncols,std::vector{nlines,Cell{}};
关键的好处是,您不必手动分配和管理内存

UPD:我曾想过使用单个指针(不是指向指针的指针)创建一个2D伪数组,并使用I*ncols+j访问一个单元格

这是一个更好的想法,将数据保存在单个平面向量中可以减少碎片

std::vector<Cell> cells(nlines*ncols, Cell{});
std::向量单元(nlines*ncols,单元{});
为了便于访问,您可以将这个1D向量封装在一个类中,该类公开一个
操作符()(std::size\u t row,std::size\u t col)
,该操作符将(row,col)索引转换为1D数组中的位置。

您需要编写

Memory::Memory(std::size_t nlines, std::size_t ncols)
    :cells(new *Cell[nlines]) 
{
...
}
(注意
单元格*
而不是
单元格

std::array
只是编译时固定的数组大小,因此它不适合您的用途

我同意你的编辑。不要为矩阵创建指针数组,使用带索引的平面数组方法
i*ncols+j
。前者更难处理,开销也更高(因为有许多新的调用)


如果您担心乘法开销,可以为
i*ncols
创建一个查找表。但我怀疑这是否值得。

初始化单元格的错误消息在这里提供了大量信息。您正试图将
单元格[nline]
(即1D数组)分配给类型为
单元格**
(2D数组)的对象。您需要将此行更改为
单元格(新单元格*[nlines])
谢谢。我还发现我不必迭代数组并手动分配每个单元格。所以C++中的<代码>新< /代码>用默认值填充元素,在初始化类声明和构造函数中的默认值之间有什么不同吗?如果你的意思是,1)
单元格1之间是否存在差异和2)
单元cell2=单元{}struct Cell{char contents='.;bool is_free=true}
struct Cell{char contents;bool没有字符;Cell(char contents='.',bool is_free=true):contents(contents),is_free(is_free){}。我有一种感觉,它们是相互的,但我听说聚合不能有初始值设定项,所以我很好奇是否还有其他差异。啊,我误解了,在这种情况下,第一个是最好的,但这是风格问题。