Увеличить граф с существующей структурой данных или использовать ее в качестве структуры данных

Я пишу приложение, которое анализирует структуру данных с чем-то вроде

struct Block
{
std::string foo;
/* ... even more local data ... */
};

std::map<std::string, Block> blockContainer; // Each Block will have a name here

struct Signal
{
// the direct links to the Blocks, no redundant storage of the name so that an
// simple renaming of a Block would be possible
std::map<std::string, Block>::iterator from;
std::map<std::string, Block>::iterator to;

std::string bar;
/* ... even more local data ... */
};

std::vector<Signal> signalContainer;

Разбор и заполнение этого списка было довольно легко. Теперь мне нужно сделать топологическую сортировку блоков в зависимости от сигналов — также довольно легко, когда я использую Boost::Graph,

Но сначала проанализировать его в структуре данных STL, а затем скопировать их в структуру Boost :: Graph, для меня не имеет большого смысла. Тем более, что все, что будет сделано с этими данными впоследствии, это, возможно, некоторые простые модификации (добавление / удаление блоков и сигналов, некоторый перенаправление сигнала; повторная сериализация его) с новой топологической сортировкой впоследствии.

Так что я буду в порядке с любым из этих возможных решений:

  1. Сделать Boost :: Graph работать на моих контейнерах напрямую
  2. Разобрать данные непосредственно в структуры данных Boost :: Graph (и, например, использовать граф со связанными свойствами, такими как boost::adjacency_list<boost::mapS, boost::vecS, boost::directedS, Block, Signal>)

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

Кто-нибудь может мне помочь?

Спасибо!

3

Решение

Никто не достаточно умен для документирования boost :: graph;) Чтобы научиться его использовать, нужно много времени.

Вы можете создать структуру графов над вашими данными, однако, это, вероятно, будет довольно болезненным. Там есть документация: http://www.boost.org/doc/libs/1_52_0/libs/graph/doc/leda_conversion.html

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

Вы видели этот вопрос: добавление пользовательских вершин в график наддува это отвечает вашим потребностям?

Вы также можете сделать следующее, чтобы создать узел (или ребро) и сразу определить свойства:

vertex_t u = boost::add_vertex(Block(42, "hi"), g);

Возможно, вам придется поддерживать карту при разборе.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector