我是C ++编程的初学者。我想构建一个具有不同列大小的动态二维数组,这是事先不知道的。
例如,从数组A [9] = {1,2,3,0,4,0,1,2,1}。 每次遇到值为0的元素时,都会创建一个新行。基本上,当遇到0时,行值增加,列值重置为0.如果遇到非零值,则保持行值并增加列值。我还想找出2D数组的行和列大小。我还希望能够将列和行值存储在其他变量中。 基于上面的例子,我想要的2D阵列应该如下所示。
1 2 3
0 4
0 1 2 1
以下是我正在进行的计划。我不知道如何将行和列值的变化与我的2D数组联系起来。
int nRows = 0;
int **X = new int *[nRows];
int *S = new int [nRows];
int nCols=-1;
int array[9]={1,2,3,0,4,0,1,2,1};
for(int i=0; i<9; i++)
{if (array[i]==0)
{nRows++;
nCols=0;}
else
nCols++;}
for(int i=0; i<nRows; i++)
{
X[i] = new int[nCols];
S[i] = nCols;
cout<<"\n"<<S[i];}
我搜索了其他相关问题,但根据我的理解,他们都为每行指定了列大小,而不是依赖于其他公式。请原谅我的英语,如果我能澄清我的问题,请告诉我。谢谢。
答案 0 :(得分:1)
这很好用:
int givenArray[9]={1,2,3,0,4,0,1,2,1};
vector<vector<int>> my2dArray;
for(int i=0;i<9;i++) //iterate through all elements of the given array
{
if (i==0) //adding the first element
{
my2dArray.resize(my2dArray.size()+1);
my2dArray.back().push_back(givenArray[i]);
continue;
}
if (givenArray[i] == 0) //re-size if 0 is encountered
{
my2dArray.resize(my2dArray.size()+1);
}
my2dArray.back().push_back(givenArray[i]);
}
以2d方式打印输出:
for (auto vec1d : my2dArray){
{
for (auto i : vec1d){
cout << i << " ";
}
cout << endl;
}
}
答案 1 :(得分:0)
这样的事情应该有效:
typedef std::vector<int> Row;
typedef std::vector<Row> TwoDArray;
TwoDArray arr;
int array[9]={1,2,3,0,4,0,1,2,1};
Row row;
for(int i=0; i<9; i++)
{
if (array[i]==0)
{
arr.push_back(row);
row.clear();
row.push_back(0);
}
else
{
row.push_back(array[i]);
}
}
答案 2 :(得分:0)
int array[9]={1,2,3,0,4,0,1,2,1};
vector<vector<int>> result;
for(int i=0; i < sizeof(array)/sizeof(array[0]); ++i)
{
if (array[i] == 0 || i == 0)
result.resize(result.size()+1);
result.back().push_back(array[i]);
}