【问题标题】:How to implement 2D vector array?如何实现二维向量数组?
【发布时间】:2012-03-14 01:48:35
【问题描述】:

我是第一次使用 STL 库中的矢量类。我应该如何添加到向量数组的特定行?

struct x{
     vector <vector <int> > v;
     int row;
 };

vector< int* > my ints;
int add;

如果我想用第一个整数指针添加到 v 的第一行,我可以这样做吗

myints[0]->v[myints[0]->row].push_back(add);

这种方法是否可以创建向量ints 的二维向量,其中每行可能具有不同的长度(即具有不同的列数)?

【问题讨论】:

  • 那个著名的标准模板库库
  • vector&lt; int* &gt; my ints; 不是有效的 C++。让我们再试一次这个问题,用一个重现问题的可编译测试用例。
  • myints[0]int*myints[0]-&gt;v 到底是什么?

标签: c++ vector


【解决方案1】:

我不确定问题出在哪里,因为您的示例代码有几个错误,并没有真正说明您要做什么。但以下是添加到 2D 矢量特定行的方法:

// declare 2D vector
vector< vector<int> > myVector;
// make new row (arbitrary example)
vector<int> myRow(1,5);
myVector.push_back(myRow);
// add element to row
myVector[0].push_back(1);

这是否回答了您的问题?如果没有,您能否尝试更具体地说明您遇到的问题?

【讨论】:

    【解决方案2】:

    如果您事先知道(最大)行数和列数,您可以使用resize() 来初始化一个向量向量,然后使用operator[] 修改(和访问)元素。示例:

    int no_of_cols = 5;
    int no_of_rows = 10;
    int initial_value = 0;
    
    std::vector<std::vector<int>> matrix;
    matrix.resize(no_of_rows, std::vector<int>(no_of_cols, initial_value));
    
    // Read from matrix.
    int value = matrix[1][2];
    
    // Save to matrix.
    matrix[3][1] = 5;
    

    另一种可能性是只使用一个向量并将 id 拆分为多个变量,访问类似于vector[(row * columns) + column]

    【讨论】:

      【解决方案3】:

      只需使用以下方法创建一个二维向量。

      int rows, columns;        
      
      // . . .
      
      vector < vector < int > > Matrix(rows, vector< int >(columns,0));
      

      vector < vector < int > > Matrix;
      
      Matrix.assign(rows, vector < int >(columns, 0));
      
      //Do your stuff here...
      

      这将创建一个大小为 rows * columns 的矩阵并用 zeros 对其进行初始化,因为我们在构造函数中传递了一个 zero(0) 作为第二个参数,即 向量(列,0)。

      【讨论】:

      • 如果您事先知道确切的列数,或者甚至是相当小的最大值,您可能希望使用std::vector&lt; std::array&lt;int&gt; &gt;。如果您也知道确切的行数,std::array&lt; std::array &lt;int&gt; &gt;
      【解决方案4】:

      //先初始化二维向量

      vector&lt;vector&lt;int&gt;&gt; matrix;

      //初始化要插入矩阵的一维向量

      vector&lt;int&gt; row;

      //用值初始化行

      row.push_back(val1);

      row.push_back(val2);

      //现在向矩阵中插入值

      matrix.push_back(row);

      //输出- [[val1,val2]]

      【讨论】:

        【解决方案5】:

        我们可以轻松地将向量用作二维数组。为此,我们使用 resize() 方法。 下面的代码有助于理解这个问题。

        代码片段:

        #include<bits/stdc++.h>
        using namespace std;
        
        int main()
        {
            ios::sync_with_stdio(false);
            int row, col;
            cin>>row>>col;
        
            vector <vector<int>> v;
            v.resize(col,vector<int>(row));
        
            //v = {{1,2,3}, {4,5,6}, {7,8,9}}; 
        
            /** input from use **/
            for(int i=0; i<row; i++)
            {
               for(int j=0; j<col; j++)
               {
                  cin>>v[i][j];
               }
            }
        
            for(int i=0;i<row; i++)
            {
               for(int j=0;j<col;j++)
               {
                  cout<<v[i][j]<<" ";
               }
            }
            return 0;
        }
        

        【讨论】:

          【解决方案6】:

          另一种定义二维向量的方法是声明一个对的向量。

           vector < pair<int,int> > v;
          
          **To insert values**
           cin >> x >>y;
           v.push_back(make_pair(x,y));
          
          **Retrieve Values**
           i=0 to size(v)
           x=v[i].first;
           y=v[i].second;
          

          对于 3-d 向量,请查看 tuple 和 make_tuple。

          【讨论】:

          • 那不是 2D,那是 1.5d。其中一个维度被硬编码为大小 2。
          【解决方案7】:

          我使用这段代码。对我来说很好。复制它并在您的计算机上运行。你自己就明白了。

          #include <iostream>
          #include <vector>
          using namespace std;
          int main()
          {
              vector <vector <int> > matrix;
              size_t row=3 , col=3 ;
              for(int i=0,cnt=1 ; i<row ; i++)
              {
                  for(int j=0 ; j<col ; j++)
                  {
                      vector <int> colVector ;
                      matrix.push_back(colVector) ;
                      matrix.at(i).push_back(cnt++) ;
                  }
              }
              matrix.at(1).at(1) = 0;     //matrix.at(columns).at(rows) = intValue 
              //printing all elements
              for(int i=0,cnt=1 ; i<row ; i++)
              {
                  for(int j=0 ; j<col ; j++)
                  {
                      cout<<matrix[i][j] <<" " ;
                  }
                  cout<<endl ;
              }
          }
          

          【讨论】:

            【解决方案8】:

            向量矩阵(行,向量(col, 0));

            这将初始化 rows=rowcolumns = col 的二维向量,所有初始值都为 0。无需初始化和使用调整大小。

            由于向量是用大小初始化的,你可以像数组一样使用“[]”操作符来修改向量。

            矩阵[x][y] = 2;

            【讨论】:

              【解决方案9】:

              vector&lt;int&gt; adj[n]; // 其中 n 是二维向量中的行数。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-11-09
                • 2020-03-04
                • 1970-01-01
                • 2021-01-31
                • 2016-08-29
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多