C++中的二维数组字面量

11

我试图构建一个指向指针的二维数组,但这样是不起作用的:

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}
};

这可行吗?我应该怎么做?


编辑:

看起来我可能正在尝试做错误的事情。我有一个函数,它以未知大小的bool类型的二维数组以及整数宽度和高度作为参数。目前,该函数的签名为:

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

我希望能构造一个数据字面量,但我也需要这个函数适用于任何大小的数组。

3个回答

18
您可以有一个数组的数组(有时称为多维数组):
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);

1
虽然我不会称第一个为数组的数组,因为这有点模糊不清。它更像是一个带有特殊访问语法的单个数组。+1 - Niklas B.
@NiklasB:一个数组的数组确切而明确地就是它所表示的东西。但标准也提到了“多维数组”,因此我会加上这个短语。 - Mike Seymour
感谢您澄清这个问题 :) 我总是乐于学习新的东西。 - Niklas B.
1
采用了基于模板的重载方式,将一个固定大小的数组转换为指向指针的指针,并将其传递进函数中。我很惊讶这个模板是多么聪明 - 我原本期望需要执行do_something<2,4>(twoByFourArray)而不是do_something(twoByFourArray) - Eric
一个人也可以做一个 [x * y] 的数组,其中 array[i, j] = array[i * y + j] - Gustavo6046

4
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**,以便将其传递给接受任何大小数组的函数调用。 - Eric
你可以将“数据”传递给这样的函数。 - perreal
@perreal:取决于接收函数期望的输入格式。 - Niklas B.
@Eric:这个函数是期望一个数组的数组还是一个多维数组? - Niklas B.
1
@perreal:不行,你不能这样做。一个数组可以转换为指针,但是一个数组的数组不能转换为指针的数组。 - Mike Seymour
显示剩余8条评论

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,因为编译器可以推断出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接