LINUX.ORG.RU

Почему программа ведёт себя не так, как предполагается?

 , ,


0

2
#include <fstream>
#include <iostream>
#include <string>
#include <typeinfo>
#include <vector>
using namespace std;


struct Node
{
	char name;
	vector< vector<Node>::iterator> exits;
	bool operator== (const Node& other) const { return name==other.name; }
	Node(char t)
	{
		name = t;
	}
};



int main ()
{
	ifstream in("input.txt");
	string tmp;
	vector<Node> graph;
	while (in >> tmp)
	{
		Node t (tmp[0]);
		Node t0 (tmp[2]);

		auto node = find(graph.begin(), graph.begin()+graph.size(), t);
		auto node_exit = find(graph.begin(), graph.begin()+graph.size(), t0);
		if (node == graph.end() && node_exit == graph.end())
		{
			graph.push_back(t);
			graph.push_back(t0);
			auto node = find(graph.begin(), graph.begin()+graph.size(), t);
			auto node_exit = find(graph.begin(), graph.begin()+graph.size(), t0);
			node->exits.push_back(node_exit);
		}
		else if (node_exit == graph.end())
		{
			graph.push_back(t0); // (*)
			auto node = find(graph.begin(), graph.begin()+graph.size(), t);
			auto node_exit = find(graph.begin(), graph.begin()+graph.size(), t0);
			node->exits.push_back(node_exit);
		}
		else
		{
			auto node = find(graph.begin(), graph.begin()+graph.size(), t);
			auto node_exit = find(graph.begin(), graph.begin()+graph.size(), t0);
			node->exits.push_back(node_exit);
		}
	}
	return 0;
}

Содержание input.txt:

A-B
B-C

После выполнения строчки (*) ломается итератор graph[0].exits[0] — должен указывать на B, а указывает на бурду. ЧЯДНТ?


1. Замени vector на list. У него такой проблемы нет.
2. Храни указатели на ноды (weak_ptr, например), а не итераторы. Итераторы не предназначены для этого.
3. Попробуй хранить граф в виде матриц (смежности, инцидентности). Если он не очень большой, конечно. И если преподаватель не требует.

E ★★★
()
Ответ на: комментарий от E

Храни указатели на ноды (weak_ptr, например), а не итераторы

Указатели будут ровно так же испорчены при перевыделении памяти под вектор

Gvidon ★★★★
()

указывает на бурду

C++

Да нет, все именно так, как ожидается.

anonymous
()

Почему бы тебе при инициализации графа не создать и сохранить в одном месте все ноды. Хранить их только там и удалить от туда по завершению алгоритма, а в остальных манипуляциях использовать указатели на ноды в начальном хранилище. Так ты и от утечек памяти убережешься и поломки указателей избежишь.

Aswed ★★★★★
()
Ответ на: комментарий от Gvidon

Просто думал, что capacity изначально достаточно большой, чтобы хранить 3 ноды (вроде немного). Спасибо!

vmax
() автор топика
Ответ на: комментарий от E

Я б и рад работать с матрицами смежности, но преподаватель, как Вы угадали, требует :) Собственно, решил проблему, сохраняя не итераторы/указатели, а индексы элементов в векторе и каждый раз высчитывая graph.begin()+index

vmax
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.