C ++中的2D数组文字

时间:2012-02-09 12:23:49

标签: c++ multidimensional-array literals

我正在尝试以指针指针的形式构建一个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}
};

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


编辑:

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

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

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

3 个答案:

答案 0 :(得分:13)

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

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 :(得分: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] };

答案 2 :(得分:1)

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放在[大括号]中,因为它可以由编译器推断。