7

我正在尝试将 2D 数组转换为 1D。我对 C/C++ 非常陌生,但我认为学习如何将 2D 数组转换为 1D 非常重要。所以在这里我偶然发现了这个问题。

到目前为止,我的代码是 http://ideone.com/zvjKwP

#include<iostream>

using namespace std;

int main()
{

int n=0,m=0; // 2D array nRow, nCol
int a[n][m];
int i,j; // цикъл въвеждане 2D
int q,p,t; // for 2D=>1D
int b[100];
int r; // for cout
cout<<"Enter the array's number of rows and columns: ";
cin>>n>>m;

// entering values for the 2D array
    for (i = 0;i<=n;i++)
    {
        for (j = 0;j<=m;j++)
        {
            cout<<"a["<<i<<"]["<<j<<"]="<<endl;
            cin>>a[i][j];
            cin.ignore();
        }
    }

  // Most likely the failzone IMO
  for (q = 0;q<=i;q++)
    {
        for (t = 0;t<=i*j+j;t++)
        {
            b[t] = a[i][j];
        }
    }
    // attempting to print the 1D values
     cout<<"The values in the array are"<<"\n";
    for(r=0;r<=t;r++)
    {
        cout<<"b["<<r<<"] = "<<b[r]<<endl;
    }

    cin.get();
    return 0;
    }

我在我认为我失败的地方写了一条评论。

我还必须将进入 1D 的数字限制为 value^2 大于 50 的数字。但我肯定必须通过转换 2D=>1D 来解决问题你能帮帮我吗?

4

6 回答 6

7

你的假设是对的:

循环应该是这样的:

for (q = 0; q < n; q++)
{
    for (t = 0; t < m; t++)
    {
        b[q * m + t] = a[q][t];
    }
}

从高维数组的角度考虑这种转换总是更容易。此外,对于您的代码,您实际上并未修改ijb分配周期中,因此您不应期望将不同的值分配给b.

于 2013-11-11T18:51:46.723 回答
5

http://www.cplusplus.com/doc/tutorial/arrays/

在该链接中查看关于伪多维数组的部分。

我已经看到许多导致下标算法错误的示例。如有疑问,请追查。下标二维数组的顺序应该从 0-(HEIGHT*WIDTH-1) 开始

#define WIDTH 5
#define HEIGHT 3

int jimmy [HEIGHT * WIDTH];
int n,m;

int main ()
{
  for (n=0; n<HEIGHT; n++)
    for (m=0; m<WIDTH; m++)
    {
      jimmy[n*WIDTH+m]=(n+1)*(m+1);
    }
}
于 2014-06-13T18:29:59.313 回答
2

首先,一维数组的大小应该是n*m.

循环可以如下-

int lim = n*m;

for(q = 0; q<lim; ++q) {

    b[q] = a[q/m][q%m];
}
于 2013-11-11T19:10:41.657 回答
2

你也可以这样做;

int singleArraySize = columns * rows;
for (int i = 0; i < singleArraySize; ++i)
    *(oneDArr + i) = *(twoDArr + i);

第二个例子是利用二维数组占据连续空间的事实。

因此,如果您array[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}}在计算机内存中存储如下:

memory address | array[i][j] | value
---------------+-------------+---------
0x1            | array[0][0] | 1
0x2            | array[0][1] | 2
0x3            | array[0][2] | 3
0x4            | array[1][0] | 4
0x5            | array[1][1] | 5
0x6            | array[1][2] | 6
0x7            | array[2][0] | 7
0x8            | array[2][1] | 8
0x9            | array[2][2] | 9

其中内存地址是存储值的地址。

于 2021-09-13T00:33:22.907 回答
1

这段代码

int n=0,m=0; // 2D array nRow, nCol
int a[n][m];

是无效的。首先,维度应该是常量表达式,将它们设置为 0 是没有意义的。

完成任务的更简单方法是使用指针。例如

int *p = b;

for ( const auto &row : a )
{
    for ( int x : row ) *p++ = x;
}
于 2013-11-11T19:03:38.427 回答
0

此答案使用 C 实用程序memcpy。由于内存是连续的,您可以将其复制为一个字节块:

#include <string.h> // For memcpy
#include <iostream>

int main() {
    // Fill in the 2D array with some values...
    int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};

    // Allocate the 1D array
    int b[3*3];

    // Copy into 1D array
    memcpy(b,a,9*sizeof(int));

    // Print the result
    for (int i(0); i<9; ++i) {
        std::cout << b[i] << " ";
    }
}

输出:

1 2 3 4 5 6 7 8 9
于 2021-12-03T20:49:44.167 回答