C++中的2D数组文字

2D array literals in C++

本文关键字:文字 数组 2D 中的 C++      更新时间:2023-10-16

我正在尝试以指针到指针的形式构建一个2D数组。这不起作用:

bool** data =  {
    new bool[4] {true, true, true, true},
    new bool[4] {true, false, false, true},
    new bool[4] {true, false, false, true},
    new bool[4] {true, true, true, true}
};

有可能吗?我应该怎么做?


编辑:

看来我可能是想做错事。我有一个函数,它以一个未知大小的bools的2D数组以及整数宽度和高度作为参数。目前,签名为:

 foo(bool** data, int width, int height)

我希望能够为数据构造一个文字,但我也需要这个函数来处理任何大小的数组。

您可以有一个数组数组(有时称为多维数组):

bool data[][4] =  {
    {true, true, true, true},
    {true, false, false, true},
    {true, false, false, true},
    {true, true, true, true}
};

然而,它不能转换为bool**,所以如果您需要转换,那么这将不起作用。

或者,指向静态数组的指针数组(转换为bool**):

bool data0 = {true, true, true, true};
bool data1 = {true, false, false, true};
bool data2 = {true, false, false, true};
bool data3 = {true, true, true, true};
bool * data[] = {data0, data1, data2, data3};

或者如果你真的想要动态数组(这几乎肯定是个坏主意):

bool * make_array(bool a, bool b, bool c, bool d) {
    bool * array = new bool[4];
    array[0] = a;
    array[1] = b;
    array[2] = c;
    array[3] = d;
    return array;
}
bool * data[] = {
    make_array(true, true, true, true),
    make_array(true, false, false, true),
    make_array(true, false, false, true),
    make_array(true, true, true, true)
};

或者,您可以坚持使用数组,并修改函数以引用数组而不是指针,如果需要支持不同的维度,则可以将维度推断为模板参数。只有在编译时维度总是已知的情况下,这才有可能。

template <size_t N, size_t M>
void do_something(bool (&array)[N][M]);
do_something(data);
bool data_[][4] =  {
     {true, true, true, true},
     {true, false, false, true},
     {true, false, false, true},
     {true, true, true, true}
};
bool *data[4] = { data_[0], data_[1], data_[2], data_[3] };
bool *data[] =  {
    (bool []){true, true, true, true}
     ,(bool[]) {true, false, false, true}
     ,(bool[]) {true, false, false, true}
     ,(bool[]) {true, true, true, true}
};

这可以根据您的意愿转换为bool**。这不是一个数组。这是一个指针数组。

通过用(bool [])对每一行进行预处理,我们可以使其衰减为一个指针。因此,每一行都是一个指针,然后可以组合成一个由四个指针组成的数组。

编辑:您可以将显式4放入[大括号]中,因为它可以由编译器推导出来。