从矢量读取时,我将值放入零中.我有:
class Graph {
public:
vector<Vertex> vertices;
};
class Vertex {
public:
vector<int> adjacentVertices;
};
Run Code Online (Sandbox Code Playgroud)
在我的加载方法然后:
int vertices, edges;
cin >> vertices >> edges;
Graph mainGraph;
mainGraph.vertices.reserve(static_cast<unsigned int>(vertices));
int tmp1, tmp2;
for (int i = 0; i < edges; i++) {
cin >> tmp1 >> tmp2;
mainGraph.vertices[tmp1].adjacentVertices.push_back(tmp2);
cout << mainGraph.vertices[tmp1].adjacentVertices.size(); //PRINTS NUMBERS -> SEEMS OKAY
}
cout << mainGraph.vertices.size(); //IS ZERO???
for(const Vertex &v : mainGraph.vertices){ //CRASHES
cout << v.adjacentVertices.size();
}
Run Code Online (Sandbox Code Playgroud)
我打赌这是非常愚蠢的,但我错过了什么?我读过如果不需要特殊的构造函数,向量将在使用时自行构造.
改变这个:
mainGraph.vertices.reserve(static_cast<unsigned int>(vertices));
Run Code Online (Sandbox Code Playgroud)
对此:
mainGraph.vertices.resize(static_cast<unsigned int>(vertices));
Run Code Online (Sandbox Code Playgroud)
因为使用reserve(),不会创建向量的单元格,这可以通过resize()来完成.
因此,在您的代码中,当您执行时,您将调用未定义的行为(UB)mainGraph.vertices[tmp1],因为您尝试访问尚未构造的对象!
reserve不会更改vector或构造项目的大小.它只分配在添加元素时保留的内存.
您的调用mainGraph.vertices[tmp1]未定义,因为它正在访问原始内存.
而不是reserve,用于resize分配和构造项目.