【问题标题】:How to convert 2D array to 1D in C++?如何在 C++ 中将二维数组转换为一维?
【发布时间】:2021-03-11 18:36:08
【问题描述】:

例如,我有一个二维数组 A={{1,2,3}, {2,3},{5}};我想获取数组A中存在的所有行。我将数组的长度存储在变量“lenA”中,这里lenA = 3。另外我有一个数组 B,它具有 A 中每个子数组的长度。在这种情况下说 B={3,2,1}。参考我的示例数组 A,如何从一个二维数组(即 A)中动态获取 3 个子数组? 所以结果我会有类似的东西:

A1={1,2,3}
A2={2,3}
A3={5}

【问题讨论】:

  • 好的,我想了很多,感谢您的澄清。但这就是你已经拥有的,不是吗?
  • 不,我有二维数组。必须将存储在每个索引处的子数组放入一个新的数组变量(新的内存位置)中,并且这些子数组将使用 for 循环动态命名。无法弄清楚如何动态分配内存位置和名称。
  • 变量名(和变量本身)不能在 C++ 中动态分配。有时,std::map 会在人们提出像您这样的请求时做他们想做的事。您可以使用字符串作为映射的键,并使用该键来检索动态分配的数组。
  • A 是如何定义的?如果行的长度不同,那么它可能是int**int*[]?那么你已经拥有了你想要的东西。显示一些代码将有助于澄清这一点。

标签: c++ arrays multidimensional-array dynamic-memory-allocation


【解决方案1】:

您不能在 C++ 中动态生成新标识符。您可以获得的最接近的方法是使用预处理器生成您的名称,并且根据定义,这是在编译之前完成的。

如果您已经有固定数量的命名数组指针,您可以动态分配它们。但是任何必须在运行时接受任意行数的解决方案都需要您使用数组索引之类的东西。

for (int i = 0; i < lenA; i++)
{
    // Do something with the row at A[i]
}

【讨论】:

    【解决方案2】:

    伪代码

    for i in 0 to lenA-1
        for j in 0 to lenB[i]-1
            A[i][j] whatever...
    

    【讨论】:

      【解决方案3】:

      我尝试将 A(4x4) 转换为三角形 *a[4]:

      #include <iostream>
      #include <algorithm>
      int main()
      {
         constexpr int lenA = 4;
         double A[lenA][lenA]={{1,2,3,4}, {5,6, 7, 0}, {8, 9,0,0},{10,0,0,0}};
         double *a[lenA];
         int B[lenA] = {4, 3, 2, 1};
      
         for (int i=0; i < lenA; i++)
          {
             a[i] = new double [ B[i] ];
             std::copy_n(A[i], B[i], a[i]);
          }
         for (int i=0; i<lenA; i++) {
             std::cout << "row " << i << ": ";
             for (int j=0; j<B[i]; j++) {
                 std::cout << a[i][j] << ".  ";
                 }
             std::cout <<std::endl;
            }
         return 0;
      }
      

      结果:

      $ ./a.exe
       row 0: 1.  2.  3.  4.
       row 1: 5.  6.  7.
       row 2: 8.  9.
       row 3: 10.
      

      【讨论】:

        【解决方案4】:

        您可以在http://cpp.sh/57pi2找到以下代码的验证

        A1D 代表您要查找的一维数组,

        #include <iostream>
        
        int main()
        {
            const int lenA = 4;
            double A2D[][lenA]={{1,2,3,4},{5,6,7},{8,9},{10}};
            double *A1D;
            int B[lenA] = {4,3,2,1};
        
            int num_of_elements = 0; 
            for (int i=0; i < lenA; i++)
                num_of_elements += B[i];
            
            A1D = new double[num_of_elements]   ; 
            for (int i=0, k=0; i<lenA; i++) 
                for (int j=0; j<B[i]; j++)
                    A1D[k++] = A2D[i][j];
        
            for (int j=0; j<num_of_elements; j++)
                std::cout << A1D[j] << std::endl;
        }
        

        【讨论】:

          【解决方案5】:

          std::ranges in C++20ranges libraryC++14 兼容)以干净的方式进行:

              double A[][4] {
                  { 1, 2, 3, 4}, 
                  { 5, 6, 7, 0}, 
                  { 8, 9, 0, 0},
                  {10, 0, 0, 0}
              };
              for (auto x : std::ranges::views::join(A))
                  std::cout << x << '\n';
          

          https://godbolt.org/z/hPP7e9

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-03-08
            • 2021-11-23
            • 1970-01-01
            • 2017-03-22
            • 2011-07-05
            • 2015-07-16
            • 1970-01-01
            相关资源
            最近更新 更多