Подобие графа

vadim_bz

Имеется примерно такой вот класс:
class Room {
    private:
        string name;
        string story;
        vector <Room*> rooms; //указатели, куда доступен переход
    public:
        Room () {}
        Room (string name, string story) {
            this->name = name;
            this->story = story;
            }
    public:
        string getName () const { return name; }
        string getStory () const { return story; }
    };
Нужно создать некое подобие графа, элементом которого был бы класс расположенный выше. Переменная rooms содержала бы указатели на все доступные соседние элементы. И вот всё голову ломаю и придумать не могу, как это всё грамотно организовать. А именно, в каком формате будет ввод (но обязательно из файла) и как это всё дело потом создать и связать опираясь на ввод. Буду рад любым пинкам в правильном направлении. UPD: Необязательно себя утруждать и писать код, приму любую помощь. Достаточно просто объяснить, как это возможно реализовать, либо не возможно и свой вариант решения задачи.
14 ответов

vadim_bz

Я думал как раз код написать . Идея в том, чтобы делать связи в файле по индексам или по ключам.


vadim_bz

UPD2: То что уже имеется: -все возможные объекты room вводятся из файлов Из идей было такое: -названия этих файлов (с набором данных для room, описано выше) будут расположены иерархически в файле - карте и в зависимости от степени вложенности - присваивать каждому названию индекс. -В соответствии индексу и протягивать связи между объектами, создавая тем самым граф.Но с реализацией в тупике.


vadim_bz

Зачем объектам комнат иерархичность? Можно, к примеру, иметь четыре записи/файла: 0: Первая комната, связи: 1, 2 1: Вторая комната, связи: 0, 3 2: Третья комната, связи: 0, 3 3: Четвёртая комната, связи: 1, 2 Затем по этим данным при загрузке восстанавливать массив указателей.Или вопрос в том, как по таким данным восстановить объекты?


vadim_bz

Vort_, о таком варианте структуры файла - карты и не подумал, хотел как-то сделать что-бы и наглядно было ясно что-куда и что-бы это потом можно было индексировать от степени вложенности. Но теперь от этой идеи откажусь.Но это даже наверное не главная проблема, не хватает информации и знаний о том, как потом имея индексы воссоздать граф такого типа, не много информации по этому поводу нашёл. Если вас не затруднит, я бы был рад если вы покажите как.


vadim_bz

Вот пример: Файл:
4
First room
First room description
2 1 2
Second room
Second room description
2 0 3
Third room
Third room description
2 0 3
Fourth room
Fourth room description
2 1 2
Код:
#include <vector>
#include <string>
#include <fstream>
#include <iostream>
 
using namespace std;
 
class Room {
private:
    string name;
    string story;
    vector<Room*> rooms;
public:
    Room() {}
    Room(string name, string story) {
        this->name = name;
        this->story = story;
    }
public:
    string getName() const { return name; }
    string getStory() const { return story; }
    void addLink(Room* link) { rooms.push_back(link); }
};
 
void main()
{
    ifstream file;
    file.open("rooms.txt");
 
    int roomCount;
    file >> roomCount;
    file.ignore();
 
    vector<Room> rooms(roomCount);
    for (int i = 0; i < roomCount; i++)
    {
        string name;
        string story;
        getline(file, name);
        getline(file, story);
        rooms[i] = Room(name, story);
 
        int linkCount;
        file >> linkCount;
 
        for (int j = 0; j < linkCount; j++)
        {
            int linkedIndex;
            file >> linkedIndex;
            rooms[i].addLink(&rooms[linkedIndex]);
        }
        file.ignore();
    }
}


vadim_bz

Нужно создать некое подобие графа, элементом которого был бы класс расположенный выше.
Ну, комнаты у вас и так связаны и образуют граф через указатели. А вы в каком виде граф хотите получить?


vadim_bz

Mr.X, именно так и хотел, не был уверен в номенклатуре, так как при поисках находил нечто иное, отличное от желаемого.


vadim_bz

Уж коль далеко не ходить, как устроить для него очищение выделенной памяти?) Думаю обращаться в деструкторе к тому же файлу - карте не совсем правильно, может сделать так что бы при вызове деструктора любой комнаты очищался бы весь граф сразу, или тоже вариант не очень?


vadim_bz

Если использовать мой вариант - vector, то он сам очистится как выйдет из области видимости.


vadim_bz

Vort_, ах да, забыл сказать, сделал всё с выделением памяти и после создания всё это живёт не умирая. Вот и подумываю, как лучше организовать очищение (деструктор).


vadim_bz

За один элемент всё держится что ли? Если так, то можно создать временный массив, закинуть в него указатели на все элементы. Затем пройтись по массиву и очистить у каждого объекта ссылки на соседние комнаты (не удаляя объекты). После чего в цикле удалить все объекты в массиве.Но точно сказать, не понимая структуры решения, я не могу.


vadim_bz

Используйте shared_ptr.


vadim_bz

Используйте shared_ptr.
Только поможет ли это, если комнаты связаны в кольцо?


vadim_bz

Да, упустил из вида. Тогда weak_ptr.