Я пишу приложение, которое анализирует структуру данных с чем-то вроде
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, для меня не имеет большого смысла. Тем более, что все, что будет сделано с этими данными впоследствии, это, возможно, некоторые простые модификации (добавление / удаление блоков и сигналов, некоторый перенаправление сигнала; повторная сериализация его) с новой топологической сортировкой впоследствии.
Так что я буду в порядке с любым из этих возможных решений:
boost::adjacency_list<boost::mapS, boost::vecS, boost::directedS, Block, Signal>
)Но, похоже, я не достаточно умен, чтобы понять документацию, чтобы сделать это. Также все примеры, которые я нашел в сети, показывали, как использовать связанные свойства, но не как построить график на лету. (И, конечно, не со свойствами узла и вершины одновременно, или как использовать std::map
чтобы узлы могли обращаться к ним по их имени, …)
Кто-нибудь может мне помочь?
Спасибо!
Никто не достаточно умен для документирования 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);
Возможно, вам придется поддерживать карту при разборе.
Других решений пока нет …