Форум программистов, компьютерный форум CyberForum.ru

Подобие графа - C++

Восстановить пароль Регистрация
 
 
vadim_bz
1 / 1 / 1
Регистрация: 11.04.2015
Сообщений: 35
05.06.2016, 18:53     Подобие графа #1
Имеется примерно такой вот класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 содержала бы указатели на все доступные соседние элементы. И вот всё голову ломаю и придумать не могу, как это всё грамотно организовать. А именно, в каком формате будет ввод (но обязательно из файла) и как это всё дело потом создать и связать опираясь на ввод. Буду рад любым пинкам в правильном направлении.

Добавлено через 5 часов 24 минуты
UPD:
Необязательно себя утруждать и писать код, приму любую помощь. Достаточно просто объяснить, как это возможно реализовать, либо не возможно и свой вариант решения задачи.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
08.06.2016, 18:09     Подобие графа #21
vadim_bz, после выхода из функции ptr уничтожит объект, и weak_ptr в векторе будет невалидным.

Добавлено через 1 минуту
Что бы использовать weak_ptr, для каждой комнаты нужен shared_ptr, который, к примеру, будет хранится во внешнем контейнере, вроде вектора.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vadim_bz
1 / 1 / 1
Регистрация: 11.04.2015
Сообщений: 35
08.06.2016, 18:59  [ТС]     Подобие графа #22
Мда, выходит тогда что-то сложное и не очень красивое, уж проще тогда где то держать вектор с указателями на все элементы, уж лучше такой баласт, чем все эти заморочки с "умными указателями", где в конечном счёте так же придётся держать вектор, но только с shared_ptr.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
08.06.2016, 19:02     Подобие графа #23
vadim_bz, в случае shared_ptr и weak_ptr мы точно можем знать, когда объект уничтожен и weak_ptr не валидный. Ну и избежим new/delete.
vadim_bz
1 / 1 / 1
Регистрация: 11.04.2015
Сообщений: 35
08.06.2016, 19:58  [ТС]     Подобие графа #24
Toshkarik, я хотел то как, функция строящая граф возвращает обычный указатель на первый элемент графа (созданный первым), затем навигация осуществляется путём перебора в цикле ближайших соседей, по какому-нибудь условию, и если условие выполняется то этот указатель приравнивается новому элементу графа. А теперь получается с shared_ptr такое не провернуть да и весь массив нужно выводить. Либо сделать что бы первый элемент массива был навигационный (то что описал ранее), другими словами - текущее положение в графе, а остальные уже элементы массива - это элементы графа и тогда один этот массив выводить из функции создания графа.
Vort_
 Аватар для Vort_
186 / 186 / 52
Регистрация: 10.07.2012
Сообщений: 400
08.06.2016, 20:04     Подобие графа #25
Я не понимаю что мешает держать и массив и указатель на какой-то элемент.
Массив будет использоваться при создании и уничтожении графа, а указатель - для навигации по нему.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
08.06.2016, 20:23     Подобие графа #26
Ну, я вижу это примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class Room {
public:
   Room( const std::string &roomName, const std::string &roomStory )
   :  name( roomName ),
      story( roomStory )
   {
 
   }
 
   ~Room() {
 
   }
 
   const std::string &getName() const {
      return name;
   }
 
   const std::string &getStory() const {
      return story;
   }
   //если нужно, реализовываем set-функции
 
   void link( std::shared_ptr< Room > room ) {
      links.push_back( room );
   }
 
private:
   std::string name;
   std::string story;
 
   std::vector< std::weak_ptr< Room > > links;
};
 
int main() {
   std::vector< std::shared_ptr< Room >> rooms;
 
   //тут считываем все комнаты в вектор ( исключая связи )
 
   for ( auto &it : rooms ) {
      //тут заполняем связи с помощью функции link
   }
 
   return 0;
}
При этом связи могут хранится в файле после описания всех комнат. Причем, как можно заметить, они двусторонние, поэтому можно просто указывать пары:

Код
имяКомнаты1 описаниеКомнаты1
имяКомнаты2 описаниеКомнаты2
имяКомнаты3 описаниеКомнаты3
имяКомнаты4 описаниеКомнаты4
1 2 //первая и вторая связаны
1 3 //первая и третья связаны
2 4 //вторая и четвертая связаны
vadim_bz
1 / 1 / 1
Регистрация: 11.04.2015
Сообщений: 35
08.06.2016, 20:24  [ТС]     Подобие графа #27
Vort_, да наверное так и сделаю, а мой вариант с навигационным указателем, как первым элементом массива неадекватен?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
08.06.2016, 20:28     Подобие графа #28
Последний цикл неверно записал, там нужно считывать до конца файла, но идею я думаю Вы должны понять.
Vort_
 Аватар для Vort_
186 / 186 / 52
Регистрация: 10.07.2012
Сообщений: 400
08.06.2016, 20:32     Подобие графа #29
Цитата Сообщение от vadim_bz Посмотреть сообщение
Vort_, да наверное так и сделаю, а мой вариант с навигационным указателем, как первым элементом массива неадекватен?
Если не запутаться и не удалить потом элемент дважды, то можно.
Но я бы разнёс.
Сделал бы, к примеру, класс Graph, туда положил массив и указатель на текущий элемент.
А также методы по заполнению и очистке массива.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2016, 20:47     Подобие графа
Еще ссылки по теме:

C++ Робот (подобие игры Sokoban)
Подобие math.h для геометрии C++
Подобие чата с ботом C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
vadim_bz
1 / 1 / 1
Регистрация: 11.04.2015
Сообщений: 35
08.06.2016, 20:47  [ТС]     Подобие графа #30
Цитата Сообщение от Toshkarik Посмотреть сообщение
Последний цикл неверно записал, там нужно считывать до конца файла, но идею я думаю Вы должны понять.
Да примерно такой и вышел второй вариант, спасибо))

Думаю вопрос теперь точно исчерпан, всем ещё раз большое спасибо!
Yandex
Объявления
08.06.2016, 20:47     Подобие графа
Ответ Создать тему
Опции темы

Текущее время: 14:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru