Вектор не "сохранение значений" C ++ - PullRequest
0 голосов
/ 24 октября 2018

При чтении из вектора я помещаю значения в я получил нулевой размер.У меня есть:

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

Могу поспорить, что это очень глупо, но чего мне не хватает?Я читал, что вектор будет сам конструироваться при использовании, если не требуется специальный конструктор.

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

reserve не меняет размер vector и не создает элементы.Он выделяет только память, которая будет зарезервирована для добавления элементов.

Ваш вызов mainGraph.vertices[tmp1] не определен, поскольку он обращается к необработанной памяти.

Вместо reserve используйте resize для размещения и построения элементов.

0 голосов
/ 24 октября 2018

Это произошло потому, что вы пытаетесь управлять размером векторов вручную.Пусть STL выполняет всю работу динамически:

Graph mainGraph;
int edge;

while (cin >> edge)
{
    Vertex newVertex;
    newVertex.adjacentVertices.push_back(edge);
    mainGraph.vertices.push_back(std::move(newVertex));
}

for(const Vertex &v : mainGraph.vertices)
    cout << v.adjacentVertices.size();

https://ideone.com/BQq01W

0 голосов
/ 24 октября 2018

Измените это:

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

на это:

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

, поскольку при reserve () ячейки вектора не создаются, что может бытьсделано с помощью resize () .

В результате в вашем коде вы вызываете неопределенное поведение (UB), когда вы делаете mainGraph.vertices[tmp1], так как выпопытаться получить доступ к объекту, который не был построен!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...