如何修复邻接列表中的"Debug Assertion Failed" "vector subscript out of range"

How to fix "Debug Assertion Failed" "vector subscript out of range" in Adjacency List

本文关键字:vector Failed subscript out range of Assertion Debug 列表 何修复      更新时间:2023-10-16

我正在尝试实现从文件中调用值的图形的邻接列表表示形式,前两个数字分别是顶点数和边数。接下来的行包含边的端点。

例如:

5 6

1 2

2 3

3 1

2 4

4 5

5 2

struct Edge {
    int src, dest;
};
class Graph
{
public:
    vector<vector<int>> adjList;
    Graph(vector<Edge> const &edges, int N)
    {
        adjList.resize(N);
        for (auto &edge : edges)
        {
            adjList[edge.src].push_back(edge.dest);
            //adjList[edge.dest].push_back(edge.src);
        }
    }
};
int main(int argc, char **argv)
{
    int vertices;
    int num_edges;
    vector<Edge> edges;
    //string filename(argv[1]);
    string filename("graph5.data");
    ifstream readin;
    readin.open(filename);
    readin >> vertices >> num_edges;
    for (int i = 0; i < num_edges; i++) {
        int a, b;
        readin >> a >> b;
        edges.push_back({ a,b });
    }
    readin.close();
    Graph graph(edges, vertices);
    printGraph(graph, vertices);

    return 0;
}

我收到一条错误消息,内容如下:

"调试断言失败!

程序: C.....

表达式:向量下标超出范围">

并在"adjList[edge.src].push_back(edge.dest(;"抛出异常。

我相信我的矢量存在大小调整错误,但我不确定在哪里以及如何修复它。

这更像是一个注释,但是当您将 adjList 调整为 N(现在为 5(时,它包含从 adjList[0] 到 adjList[4] 的 5 个向量。现在,当你有一个边缘 5 2 时,你的代码会尝试将其插入到 adjList[5] 中,而 adjList[5] 不存在。

所以试着改变

adjList[edge.src].push_back(edge.dest)

adjList[edge.src-1].push_back(edge.dest)