在C ++中初始化2D向量

时间:2018-10-02 00:45:55

标签: c++ vector

因此,我在c ++中具有以下代码:

这是二维向量:

vector<vector<int>> adj;

2d向量的初始化:

adj[0].push_back(1);
adj[0].push_back(2);
adj[1].push_back(3);
adj[1].push_back(4);
adj[1].push_back(5);

打印矢量:

for(auto i : adj) {
    for(auto j : i)
        cout << j << " ";
    cout << endl;
}

编译没有错误,但是当我尝试运行时,它什么也没显示。 该如何解决?

3 个答案:

答案 0 :(得分:2)

编写adj[0]时,您隐式地假设矢量的大小至少为1,以便第零个元素存在。对于空向量(例如新初始化的向量)则不是这种情况。不幸的是,这不能保证任何类型的错误,它是未定义的行为,并且允许编译器实际执行任何操作。为了避免这种情况,您需要为这些元素腾出空间,这可以通过多种方式完成:

adj.resize(2); // now size == 2, and [0] and [1] can be safely accessed
adj[0].push_back(1);
adj[1].push_back(3);

或者

adj.push_back({}); // append default-constructed vector
adj.back().push_back(1); // append 1 to the above vector

或者,也许是最简洁的:

adj = {
    {1, 2},
    {3, 4, 5}
};
// adj now contains two vectors containing {1, 2} and {3, 4, 5} respectively

如果要使用下标[]运算符对向量进行索引访问,请考虑使用vector.at(),该函数执行相同的功能,但是如果索引超出范围,则会引发异常。这对于调试非常有帮助。

答案 1 :(得分:0)

std :: vector运算符[]期望元素存在。如果访问未定义的元素,将导致未定义的行为。将int推到内部向量之前,先将std :: vector推到外部向量。 at()成员可用于通过错误处理安全地访问任何数组索引。

#include <vector>
#include <iostream>


int main()
{
   std::vector<std::vector<int>> adj(2); // add two std::vector<int>


   adj[0].push_back(1);
   adj[0].push_back(2);
   adj[1].push_back(3);
   adj[1].push_back(4);
   adj[1].push_back(5);

   for(auto const & i : adj) {
       for(auto const & j : i)
          std::cout << j << " ";
       std::cout << std::endl;
   }
}

答案 2 :(得分:0)

您可以通过调用向量的构造函数来初始化向量的大小:

vector< vector<int> > adj(row_size, vector<int>(col_size));
                             ^^^      ^^^^^^^        ^^^
                     Dimension 1    Element Ctor     Dimension 2

然后您可以像数组一样对其进行索引。