【问题标题】:dynamic 2-dimensional array with varying column size which is not known in advance具有不同列大小的动态二维数组,事先不知道
【发布时间】:2014-09-19 06:04:15
【问题描述】:

我是 C++ 编程的初学者。我想构造一个列大小不同的动态二维数组,这是事先不知道的。

例如,来自数组 A[9]={1,2,3,0,4,0,1,2,1}。 每次遇到 value = 0 的元素时,都会创建一个新行。基本上当遇到 0 时,行值增加,列值重置为 0。如果遇到非零值,则保持行值并增加列值。我还想找出二维数组的行和列大小。我还希望能够将列和行值存储在其他变量中。 基于上面的例子,我想要的二维数组应该如下所示。

1 2 3
0 4
0 1 2 1

以下是我正在开发的程序。我不知道如何将行和列值的变化与我的二维数组联系起来。

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

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

【问题讨论】:

  • “我想构建一个动态二维数组,其列大小不同,事先不知道。” - 你在这里:std::vector&lt;std::vector&lt;int&gt;&gt; arr;

标签: c++ arrays


【解决方案1】:

这样的事情应该可以工作:

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

【讨论】:

  • 谢谢。我仍然不熟悉矢量,目前正在研究它。我将尝试在我的问题解决中实现向量。
  • 我强烈建议养成使用像boost::multi_array 这样的矩阵类而不是N维向量的习惯。
【解决方案2】:
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]);
}

【讨论】:

    【解决方案3】:

    这很好用:

    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;
        }
    }
    

    【讨论】:

    • 谢谢,上半部分工作正常。但我收到以下消息:错误:“vec1d”没有命名类型我错过了什么吗?
    • 如果您不使用 C++11,您将收到该错误。因此,不要使用“auto”关键字,而是使用迭代器来打印元素。如果您需要帮助,请参阅stackoverflow.com/questions/1784573/iterator-for-2d-vector。谢谢。
    猜你喜欢
    • 2022-11-17
    • 2021-12-13
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2018-07-12
    • 2020-07-10
    • 2014-07-28
    相关资源
    最近更新 更多