我正在尝试将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的数字限制为值^ 2大于50的数字。 但是我肯定必须通过转换2D =&gt; 1D解决问题 你能救我一下吗?
答案 0 :(得分:4)
http://www.cplusplus.com/doc/tutorial/arrays/
在该链接中查看伪多维数组的部分。
我见过很多让下标算法错误的例子。如果有疑问,请追踪它。子脚本编写2D数组的顺序应该从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);
}
}
答案 1 :(得分:3)
你的想法是正确的:
周期应该是:
for (q = 0; q < n; q++)
{
for (t = 0; t < m; t++)
{
b[q * n + t] = a[q][t];
}
}
从更高维数组的角度考虑这种转换总是更容易。此外,使用您的代码,您实际上并未在i
分配周期中修改j
或b
,因此您不应期望将不同的值分配给{{1}的不同数组成员}。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
首先,1D数组的大小应为n*m
。
循环可以如下 -
int lim = n*m;
for(q = 0; q<lim; ++q) {
b[q] = a[q/m][q%m];
}