Graph G(8);
G.insert_edge(4, 1);
我正在打电话
The exact answer: <a href="http://jsfiddle.net/yuobrupr/2">Answer</a>
我收到错误:
调试断言失败! 表达式:向量下标超出范围
我试图创建一个具有V顶点的图形。我使用向量向量来表示图形(作为邻接列表)。我的图中的节点编号从0到V-1,因此adj向量的索引表示节点的编号。除非我错了,adj [u]代表一个向量,所以我应该能够使用adj [u] .push_back(v)将顶点v推入顶点u的邻接列表中。所以在我的例子中,adj [4]应该得到与节点4相邻的顶点所在的向量,和.push_back(1)
这没有发生。我认为它与我没有正确地初始化所有内容但我已经尝试了一百万件事(甚至尝试使用for循环将向量推送到 adj vector)我只是继续得到同样的错误。
答案 0 :(得分:3)
您的数据成员向量为空,您正在超出范围访问它。原因是您默认在构造函数中初始化它。您还初始化了一个不会在任何地方使用的局部变量:
adj
您打算做的是初始化数据成员Graph(int V) : adj(V, std::vector<int>()) {}
,您可以在构造函数初始化列表中执行此操作
Graph(int V) : adj(V) {}
或者,打字少了,
-Wshadow
请注意,通过在某些常用编译器上使用合适的标志可以避免此问题。例如,使用clang
或gcc
上的{{1}}标记会产生警告,例如
警告:声明阴影一个字段'Graph'[-Wshadow]
std :: vector&gt; adj(V,std :: vector());
答案 1 :(得分:0)
在这一行:
adj
您唤起未定义的行为。因为Graph(int V) {
// Oops! Local variable adj, nothing to do with member
// of same name
std::vector<std::vector<int> > adj(V, std::vector<int>());
}
是空的(即,它没有向量)。
答案 2 :(得分:0)
构造函数中的第一个语句不会初始化adj成员,而是声明一个局部变量。你应该试试:
Graph(int V) : adj(V, std::vector<int>()){
}
答案 3 :(得分:0)
在你的构造函数
中Graph(int V) {
std::vector<std::vector<int> > adj(V, std::vector<int>());
}
你没有初始化你的成员变量,而是创建一个新的变量adj
,它在构造函数完成后被销毁。
您应该使用初始化列表来初始化您的成员变量:
Graph(int V) : adj{V, std::vector<int>{}} {}