首页 > 解决方案 > 向量不是“保存值”C++

问题描述

从向量中读取时,我将值放入我的大小为零。我有:

class Graph {
public:
    vector<Vertex> vertices;
};

class Vertex {
public:
    vector<int> adjacentVertices;
};

然后在我的加载方法中:

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();
}

我敢打赌这很愚蠢,但我错过了什么?如果不需要特殊的构造函数,我读到向量将在使用时自行构造。

标签: c++vector

解决方案


改变这个:

mainGraph.vertices.reserve(static_cast<unsigned int>(vertices));

对此:

mainGraph.vertices.resize(static_cast<unsigned int>(vertices));

因为使用reserve()不会创建向量的单元格,这可以通过resize()来完成。

结果,在您的代码中,当您调用未定义行为(UB) 时mainGraph.vertices[tmp1],因为您尝试访问尚未构造的对象!


推荐阅读