C++崩溃:push_back嵌套向量

C++ crashing:push_back on nested vectors

本文关键字:back 嵌套 向量 push 崩溃 C++      更新时间:2023-10-16
#include <iostream>
#include <vector>
using namespace std;
struct Neighbor
{
    int index;
    int weight;
    Neighbor(int, int);
};
Neighbor::Neighbor(int index, int weight)
{
    Neighbor::index = index;
    Neighbor::weight = weight;
}
void addEdge(vector<vector<Neighbor> > &graph, int v1, int v2, int weight)
{
    graph[v1].push_back(Neighbor(v2, weight));
    graph[v2].push_back(Neighbor(v1, weight));
}
int main()
{
    vector<vector<Neighbor> > graph;
    vector<vector<Neighbor> > graphIterator;
    graph[0].push_back(Neighbor(1, 5));
    graph[0].push_back(Neighbor(3, 3));
    graph[0].push_back(Neighbor(4, 2.5));
    graph[1].push_back(Neighbor(0, 5));
    graph[1].push_back(Neighbor(2, 3));
    graph[2].push_back(Neighbor(1, 3));
    graph[2].push_back(Neighbor(4, 2.5));
    graph[2].push_back(Neighbor(3, 5));
    graph[3].push_back(Neighbor(0, 3));
    graph[3].push_back(Neighbor(2, 5));
    graph[3].push_back(Neighbor(4, 2.5));
    graph[4].push_back(Neighbor(0, 2.5));
    graph[4].push_back(Neighbor(2, 2.5));
    graph[4].push_back(Neighbor(3, 2.5));
    return 0;
}

以上是我的代码,运行时似乎崩溃了。尽管声明向量图似乎工作正常,但即使我包含我的第一个push_back语句,程序也会崩溃。有人可以建议我吗?

graph[0].push_back(Neighbor(1, 5)); 时,graph 仍然为空,它没有元素,graph[0]导致 UB。

您应该首先添加元素,例如:

graph.push_back(vector<Neighbor>()); // add one element
...

vector<vector<Neighbor> > graph(5); // construct vector with 5 elements

vector<vector<Neighbor> > graph;
graph.resize(5);                    // resize vector to contain 5 elements.

这里

vector<vector<Neighbor> > graph;
/*...*/
graph[0].push_back(Neighbor(1, 5));

您正在访问尚未创建的graph[0]。如果您创建要vector<Neighbor>typedef,则最好将其可视化。

typedef vector<Neighbor> NeighborVec;
vector<NeighborVec> graph;
NeighborVec& firstVec = graph[0];

您可以清楚地看到,尽管graph已经初始化graph[0]但尚未初始化。您需要执行以下操作:

typedef vector<Neighbor> NeighborVec;
vector<NeighborVec> graph;
graph.push_back(NeighborVec());
NeighborVec& firstVec = graph[0];
firstVec.push_back(Neighbor(1, 5));

博士:

您忘记初始化嵌套向量的第一级。

graph被创建为空,然后您尝试访问graph[0],... graph[4]不存在的。

您最初可以将其声明为 vector<vector<Neighbor> > graph(5);,以便将其初始化为 5 个空向量 Neighbor s。