具有不同列大小的动态二维阵列,这是预先不知道的

时间:2014-07-28 05:00:16

标签: c++ arrays

我是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];}

我搜索了其他相关问题,但根据我的理解,他们都为每行指定了列大小,而不是依赖于其他公式。请原谅我的英语,如果我能澄清我的问题,请告诉我。谢谢。

3 个答案:

答案 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]);
}