【问题标题】:Why does this code snippet give a segmentation fault? [closed]为什么此代码段会出现分段错误? [关闭]
【发布时间】:2021-07-30 09:31:38
【问题描述】:

我无法理解为什么这个简单的代码会出现分段错误。

#include <iostream>

using namespace std;

int main ()
{
    vector <vector <int>> graph;
    graph [0] = vector <int> ();
    graph [0].push_back(0);
    cout << graph[0][0];
}

【问题讨论】:

  • 哪一行有问题?
  • graph[0]在你使用时包含什么?
  • 声明所有行报错后,如果我一一注释掉。

标签: c++ vector segmentation-fault


【解决方案1】:

你声明了一个空向量

vector <vector <int>> graph;

所以你不能使用下标操作符来改变向量中不存在的元素。

你可以至少用一个元素来声明向量

vector <vector <int>> graph( 1 );

在这种情况下这个语句

graph [0] = vector <int> ();

将被删除,你可以写

graph [0].push_back(0);
cout << graph[0][0];

另一种方法是对初始对象再使用一种方法push_back

vector <vector <int>> graph;
graph.push_back( {} );
graph [0].push_back(0);
cout << graph[0][0];

【讨论】:

  • 这是非常有用的。谢谢你。我正在尝试输入图形的边缘数据以形成邻接列表。我想我必须指定节点的数量并初始化图表以使最初有那么多空向量。我希望动态地做到这一点。仍然非常感谢:D
【解决方案2】:
vector <vector <int>> graph;
graph [0] = vector <int> ();

因为您正在访问一个空向量的元素 0。首先,给它一些元素:

graph.emplace_back();

【讨论】:

    【解决方案3】:

    您需要从一开始就使用push_back 或调整graph 的大小:

    vector<vector<int>> graph;
    graph.resize(1);
    graph[0].push_back(0);
    cout << graph[0][0];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 2013-10-20
      • 1970-01-01
      相关资源
      最近更新 更多