因此,我在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;
}
编译没有错误,但是当我尝试运行时,它什么也没显示。 该如何解决?
答案 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
然后您可以像数组一样对其进行索引。