使用STL向量

时间:2016-03-09 17:28:28

标签: c++ matrix vector stl

我想使用" vector":

创建一个矩阵
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);

5 个答案:

答案 0 :(得分:6)

当您以这种方式创建矢量时,它们的维度为0.您必须使用良好的大小初始化它们:

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

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

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

答案 1 :(得分: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

中向量中的每个元素

答案 2 :(得分:1)

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
}

答案 3 :(得分:0)

正如其他答案所述,您需要使用std::vector构造函数和元素的初始数量,以避免以后push_back将这些元素放入向量中。但是,如果您要使用 zeros 初始化矩阵,则无需指定默认的初始值设定项,因为自C ++ 11起,vector(size_type count)形式可确保将非类类型,例如int

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

这将创建一个6x6的零整数矩阵。

答案 4 :(得分:0)

使用std :: array可能更好。

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