【问题标题】:Creating a matrix using STL vector使用 STL 向量创建矩阵
【发布时间】:2016-03-09 17:28:27
【问题描述】:

我想用“向量”创建一个矩阵:

vector < vector <int> > Mat;

问题是,当我运行这段代码时:

int i ,j;
    for(i = 1  ; i <= 5 ; ++i)
    for(j = 1 ; j <= 5 ; ++j)
        Mat[i][j] = 0;

我会得到一个非常讨厌的错误。我该如何解决?

我不想像这样读取矩阵:

for(i = 1  ; i <= 5 ; ++i)
    for(j = 1 ; j <= 5 ; ++j)
        M[i].push_back(0);

【问题讨论】:

    标签: c++ matrix vector stl


    【解决方案1】:

    当您以这种方式创建向量时,它们的维度为 0。您必须使用合适的大小来初始化它们:

    vector < vector <int> > Mat(6, std::vector<int>(6));
    

    顺便说一句,在第二个向量初始化中添加一个 0 将确保它会被 0 填充:

    vector < vector <int> > Mat(6, std::vector<int>(6, 0));
    

    【讨论】:

      【解决方案2】:

      当你创建一个向量时,它一开始是空的,除非你告诉它大小应该是多少。如果向量为空,则不能使用[],因为它不进行任何范围检查,也不会增长向量。这让您有两个选择,使用push_back() 或在创建向量时为其提供大小。例如我们可以使用

      const int matrix_size = 5;
      auto mat = std::vector<std::vector<int>>(matrix_size, std::vector<int>(matrix_size));
      //                                       ^# of rows^                   ^# of cols^
      

      还要记住索引在 C++ 中是 0。这意味着对于具有 5 个元素的向量,有效索引为 [0, 4]。我们可以使用ranged based for loop 来填充向量,而不用担心向量的索引

      for(auto& row : mat)
          for(auto& col : row)
              std::cin >> col;
      

      这将填充来自cin 的向量中的每个元素。

      【讨论】:

      • 谢谢你的回答,现在我明白了。
      • @epanicafrate 没问题
      【解决方案3】:
      vector < vector <int> > Mat;
      

      这会创建一个空的 Mat;

      vector < vector <int> > Mat (5);
      

      将使用 5 个“内部”向量创建它。问题还没有解决,还需要调整内部向量的大小。

      您可以通过以下方式做到这一点:(还有很多其他更好的方法)

      for(int i =0;i<5;i++)
      {
        Mat[i].resize(5); // resizing the interior matrices
      }
      

      【讨论】:

        【解决方案4】:

        使用 std::array 可能会更好。

        std::array< std::array<int, 6>, 6> matirx;
        for(auto& row: matrix)
            for(auto& col: row)
                col = 0;
        

        【讨论】:

        • 在我看来更好的是接受任意数量的维度的通用类型。无论您使用的是典型的 4x4 还是不太典型的 3x4,它的工作原理都是一样的。您甚至可以将其设置为对两个不同维度的矩阵进行矩阵数学运算。
        【解决方案5】:

        正如其他答案所提到的,您需要使用带有初始元素数量的std::vector 构造函数,以避免稍后将元素push_back'ing 到向量中。然而,如果你想用 zeros 初始化你的矩阵,你不需要指定默认的初始化值,因为从 C++11 开始,vector(size_type count) 的形式保证将非类类型的元素清零比如int

        vector < vector<int> > Mat( 6, vector<int>(6) );
        

        这将创建一个带零的 6x6 int 矩阵。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-04
          • 2016-01-16
          • 2014-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-12
          相关资源
          最近更新 更多