如何在C ++中填充多维数组的一部分?

时间:2015-11-24 05:47:00

标签: c++ multidimensional-array

我在尝试填充多维数组m [4] [4] [3] [3]时遇到了问题。 这些实际上是我已经知道的16个3x3矩阵,我试图填补这些矩阵。这样做的正确方法是什么?我收到一个错误:“16:在'{'token'之前预期的primary-expression

请帮忙。

#include<iostream>
using namespace std;

int main()
{

    int m[4][4][3][3];//0,1,2,3 HLUT

    m[0][0]={1,0,1,
             1,1,1,
             1,0,1};
    m[0][1]={1,1,1,
             0,1,0,
             1,1,1};
    m[0][2]={1,0,1,
             1,1,1,
             1,0,1};
    m[0][3]={1,1,1,
             0,1,0,
             1,1,1};


    m[1][0]={1,0,0,
             1,0,0,
             1,1,1};
    m[1][1]={0,0,1,
             0,0,1,
             1,1,1};
    m[1][2]={1,1,1,
             0,0,1,
             0,0,1};
    m[1][3]={1,1,1,
             1,0,0,
             1,0,0};


    m[2][0]={1,0,1,
             1,0,1,
             1,1,1};
    m[2][1]={1,1,1,
             0,0,1,
             1,1,1};
    m[2][2]={1,1,1,
             1,0,1,
             1,0,1};
    m[2][3]={1,1,1,
             1,0,0,
             1,1,1};


    m[3][0]={1,1,1,
             0,1,0,
             0,1,0};
    m[3][1]={1,0,0,
             1,1,1,
             1,0,0};
    m[3][2]={0,1,0,
             0,1,0,
             1,1,1};
    m[3][3]={0,0,1,
             1,1,1,
             0,0,1};

}                   

3 个答案:

答案 0 :(得分:1)

您不能像这样初始化多维数组。如果你想这样做,就这样做:

#include<iostream>
using namespace std;

int main()
{

    int m[4][4][3][3] = {1,0,1, //1
             1,1,1,
             1,0,1,

             1,1,1,     //2
             0,1,0,
             1,1,1,

             1,0,1,     //3
             1,1,1,
             1,0,1,

            // ...
            // ...

             1,0,1,     //16
             1,1,1,
             1,0,1};


    for(int i=0;i<4;++i)
        for(int j=0;j<4;++j) {
            for(int p=0;p<3;++p) {
                for(int q=0;q<3;++q)
                    std::cout<<m[i][j][p][q];
                std::cout<<std::endl;
            }
            std::cout<<std::endl;
        }
}

或者使用4个for循环来分配您的数组。您必须始终记住,多维数组只不过是内存中的单维数组,因此只需将其初始化为单维。

答案 1 :(得分:1)

  

这样做的正确方法是什么?

您可以使用以下选项之一:

  1. 您可以在初始化时初始化矩阵的所有元素。
  2. 将成员初始化为0。然后逐个设置元素的值。
  3. 使用std::vector代替普通旧数组。
  4. 使用std::array代替普通旧数组。
  5. 方法1:初始化所有元素

    int main()
    {
    
       int m[4][4][3][3] =
       {
          1,0,1,
          1,1,1,
          1,0,1,
    
          1,1,1,
          0,1,0,
          1,1,1,
    
          1,0,1,
          1,1,1,
          1,0,1,
    
          1,1,1,
          0,1,0,
          1,1,1,
    
          1,0,0,
          1,0,0,
          1,1,1,
    
          0,0,1,
          0,0,1,
          1,1,1,
    
          1,1,1,
          0,0,1,
          0,0,1,
    
          1,1,1,
          1,0,0,
          1,0,0,
    
          1,0,1,
          1,0,1,
          1,1,1,
    
          1,1,1,
          0,0,1,
          1,1,1,
    
          1,1,1,
          1,0,1,
          1,0,1,
    
          1,1,1,
          1,0,0,
          1,1,1,
    
          1,1,1,
          0,1,0,
          0,1,0,
    
          1,0,0,
          1,1,1,
          1,0,0,
    
          0,1,0,
          0,1,0,
          1,1,1,
    
          0,0,1,
          1,1,1,
          0,0,1
       };
    
    }
    

    方法2:分配给各个元素

    int main()
    {
    
       int m[4][4][3][3] = {};
    
       m[0][0][0][0] = 1;
       m[0][0][0][1] = 0;
       m[0][0][0][2] = 1;
    
       ...
    
       m[3][3][2][0] = 0;
       m[3][3][2][1] = 0;
       m[3][3][2][2] = 1;
    
    }
    

    方法3:使用std::vector

    #include <vector>
    
    int main()
    {
       std::vector<int> m1(3);
       std::vector<decltype(m1)> m2(3, m1);
       std::vector<decltype(m2)> m3(4, m2);
       std::vector<decltype(m3)> m(4, m3);
    
       m[0][0][0] = {1, 0, 1};
       m[0][0][1] = {1, 1, 1};
       m[0][0][2] = {1, 0, 1};
    
       ...
    
       m[3][3][0] = {0, 0, 1};
       m[3][3][1] = {1, 1, 1};
       m[3][3][2] = {0, 0, 1};
    
       return 0;
    }
    

    方法4:使用std::array

    #include <array>
    
    int main()
    {
       std::array<int, 3> m1;
       std::array<decltype(m1), 3> m2;
       std::array<decltype(m2), 4> m3;
       std::array<decltype(m3), 4> m;
    
       m[0][0][0] = {1, 0, 1};
       m[0][0][1] = {1, 1, 1};
       m[0][0][2] = {1, 0, 1};
    
       ...
    
       m[3][3][0] = {0, 0, 1};
       m[3][3][1] = {1, 1, 1};
       m[3][3][2] = {0, 0, 1};
    
       return 0;
    }
    

答案 2 :(得分:0)

m[0][0]={1,0,1,
         1,1,1,
         1,0,1};

实际上是在尝试将9 int s的单维数组分配给3 int s的二维数组。

将您的初始声明更改为

int m[4][4][9]