【问题标题】:2D array literals in C++C++ 中的二维数组字面量
【发布时间】:2023-03-23 20:55:02
【问题描述】:

我正在尝试以指针的形式构造一个二维数组。这不起作用:

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 的二维数组以及整数宽度和高度作为参数。目前签名为:

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

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

【问题讨论】:

    标签: c++ multidimensional-array literals


    【解决方案1】:
    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** 传递给接受任何大小数组的函数调用
    • 您可以将“数据”传递给这样的函数。
    • 首先,如果没有第二个方括号中的边界大小,这对我不起作用。其次,如果我尝试传递 bool[][4] 而应该是 bool**,编译器会抱怨 “没有重载函数“f”的实例与参数列表匹配”
    • @perreal:取决于接收函数期望的输入格式。
    • @perreal:不,你不能。数组可以转换为指针,但数组数组不能转换为指针数组。
    【解决方案2】:

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

    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,虽然我不会将第一个称为数组数组,但这有点模棱两可。它更像是一个具有特殊访问语法的单个数组。
    • @NiklasB.: 数组数组正是(并且明确地)它的样子。但是标准也提到了“多维数组”这样的东西,所以我也会添加这个短语。
    • 感谢您解决这个问题 :) 总是乐于学习新事物。
    • 采用基于模板的重载,该重载采用固定大小的数组,并将其转换为指向布尔指针的指针。我很惊讶这个模板有多么聪明——我原以为必须用do_something&lt;2, 4&gt;(twoByFourArray) 而不是do_something(twoByFourArray)
    • 也可以做一个[x * y]的数组,其中array[i, j] = array[i * y + j]
    【解决方案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 放在 [braces] 中,因为它可以由编译器推断出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多