class Graph {


public:

    std::vector<std::vector<int>> adj;

    Graph(int V) {
        std::vector<std::vector<int> > adj(V, std::vector<int>());
    }

    void insert_edge(int v, int u);
    void print_adjacencylist();


};


void Graph::insert_edge(int v, int u) {

adj[v].push_back(u);


}


我打电话

Graph G(8);

G.insert_edge(4, 1);


我得到一个错误:

调试断言失败!
表达式:向量下标超出范围

我正在尝试创建一个具有V个顶点的图形。我正在使用向量的向量来表示图形(作为邻接表)。我图中的节点从0到V-1编号,因此adj向量的索引表示节点的编号。除非我弄错了,否则adj [u]代表向量,因此我应该能够使用adj [u] .push_back(v)将顶点v推入顶点u的邻接表中。因此,在我的示例中,adj [4]应该获得与节点4相邻的顶点所在的向量,并且.push_back(1)

这没有发生。我认为这与我没有正确初始化所有事情有关,但是我已经尝试了一百万次(甚至尝试使用for循环将向量推回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>());
}


您打算做的是初始化数据成员adj,您可以在构造函数初始化列表中进行此操作

Graph(int V) : adj(V, std::vector<int>()) {}


或者,减少打字次数

Graph(int V) : adj(V) {}


请注意,可以通过在某些流行的编译器上使用适当的标志来避免此问题。例如,在-Wshadowclang上使用gcc标志将产生警告,例如


  警告:声明遮盖了“图形”字段[-Wshadow]
  std :: vector> adj(V,std :: vector());

关于c++ - 我的 vector 载体有什么问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34015046/

10-12 21:24