分享
三行代码  ›  专栏  ›  技术社区  ›  Fire in the Hole

如何在C++中创建二维数组数组 - How to create an array of two dimensional arrays in C++

  •  2
  • Fire in the Hole  · 技术社区  · 8 月前

    假设我有一堆二维类型的数组 bool[4][4] 这样地:

    class A
    {
    public:
        static const int SIZE = 4;
        static constexpr bool blocks_S[SIZE][SIZE]={    {0,1,1,0},
                                                        {1,1,0,0},
                                                        {0,0,0,0},
                                                        {0,0,0,0}};
        static constexpr bool blocks_SR[SIZE][SIZE] = { {1,1,0,0},
                                                        {0,1,1,0},
                                                        {0,0,0,0},
                                                        {0,0,0,0}};
        static constexpr bool blocks_L[SIZE][SIZE] = {  {0,0,1,0},
                                                        {1,1,1,0},
                                                        {0,0,0,0},
                                                        {0,0,0,0}};
        static constexpr bool blocks_LR[SIZE][SIZE] =  {{1,1,1,0},
                                                        {0,0,1,0},
                                                        {0,0,0,0},
                                                        {0,0,0,0}};
        static constexpr bool blocks_Box[SIZE][SIZE] = {{1,1,0,0},
                                                        {1,1,0,0},
                                                        {0,0,0,0},
                                                        {0,0,0,0}};
        static constexpr bool blocks_Bar[SIZE][SIZE] = {{1,1,1,1},
                                                        {0,0,0,0},
                                                        {0,0,0,0},
                                                        {0,0,0,0}};  
    };
    

    我想做一个数组 block_types 它包含对所有这些二维数组的引用,因此我可以这样做: block_types[0] 并接受: blocks_S . 如何构造这样的数组(不使用 std::vector 等等)应该是什么类型的 块类型 ?我试过 auto 它发现了错误的类型。

    auto block_types = { A::blocks_S, A::blocks_SR,
                         A::blocks_L, A::blocks_LR,
                         A::blocks_Box, A::blocks_Bar};
    
    1 回复  |  直到 8 月前
        1
  •  5
  •   M.M    8 月前

    数组的初始值设定项必须是有支撑的元素值列表——这将递归应用。初始值设定项不能是另一个数组。换句话说,不可能通过给一个本身就是数组的初始值设定项来初始化数组的多个元素。

    如果需要两个具有相同内容的单独数组,则必须为它们提供相同的初始值设定项:例如,将其写出两次,或使用 #define 宏,或通过constexpr函数生成初始值设定项。


    要满足您的要求:

    我可以例如do:block_types[0]和recieve:block s_s

    您不需要创建另一个数组;您可以使用指针数组:

    using row_t = const bool[A::size];
    row_t *block_types[] = { A::blocks_S, A::blocks_SR,
                     A::blocks_L, A::blocks_LR,
                     A::blocks_Box, A::blocks_Bar};
    

    之后 block_types[0] 可以类似于 A::blocks_S .