向vector嵌套的list添加元素出现Segmentation fault,能否实现并解决?
解决vector嵌套list实现邻接表时addEdge的段错误问题
你这明显是踩了C++ vector里reserve和resize的坑啦!咱们先把问题根源说清楚:
你在构造函数里用了graph.reserve(n),这个操作只是给vector预留了能装下n个元素的内存空间,但vector的实际元素数量(也就是size())还是0。这时候你去访问graph[x-1],相当于在一个空vector里去访问根本不存在的位置——这个位置没有对应的list容器,直接越界访问内存,自然就触发段错误(Segmentation fault)了。
修复方案超简单:把reserve换成resize
把构造函数里的graph.reserve(n);改成graph.resize(n);就行。resize(n)会直接帮你创建n个默认构造的std::list<std::pair<int, int>>对象,这时候vector的size()就变成n了,每个顶点对应的位置都有一个合法的list容器,你再调用push_back添加邻接点就完全没问题了。
修改后的构造函数代码:
Graph(int n, bool directed) { this->n = n; graph.resize(n); // 替换reserve为resize this->directed = directed; this->m = 0; }
额外建议:加个边界检查
为了避免后续调用addEdge时传入非法的顶点编号(比如x或y小于1,或者大于n)导致的越界问题,你可以在addEdge里加个简单的边界校验:
void addEdge(int x, int y) { // 检查顶点编号是否合法 if (x < 1 || x > n || y < 1 || y > n) { throw std::invalid_argument("顶点编号超出范围,请输入1到" + std::to_string(n) + "之间的数"); } graph[x - 1].push_back({y - 1, 0}); if (!directed) { graph[y - 1].push_back({x - 1, 0}); } m++; }
其实你的整体思路是对的,用vector嵌套list实现邻接表是很常见的做法,只是初始化vector的时候搞混了reserve和resize的作用——记住:reserve管内存预留,resize管元素数量,要创建实际的容器元素就得用resize~
内容的提问来源于stack exchange,提问作者Vojin
相关产品推荐
相关产品推荐

