Как вписать пользовательский график в шаблон библиотеки графов буста? - PullRequest
10 голосов
/ 14 июня 2010

Я не справляюсь с шаблонами C ++ и использую библиотеку графов буста (фатальная комбинация).Я искал в Интернете и не могу найти каких-либо прямых инструкций о том, как взять пользовательскую структуру графа и приспособить ее достаточно для BGL (библиотека повышенных графов), которую я могу использовать для повышения алгоритмов обхода графов.Кто-нибудь достаточно знаком с библиотекой, чтобы помочь мне?

РЕДАКТИРОВАТЬ: Итак, главная проблема, с которой я столкнулся, это где найти источник, где общие требования для сопоставления произвольного графа с графом BGL.Я действительно новичок в шаблонах, поэтому мне трудно читать спецификации / примеры BGL.Может мне стоит поискать общий источник по шаблонам?

Ответы [ 2 ]

6 голосов
/ 16 июня 2010

Мое предложение будет полностью отказаться от использования BGL, если у вас уже нет значительного количества кода, написанного поверх него.Недавно я тестировал его для будущего использования в большом проекте анализа графиков и обнаружил, что он почти непригоден из-за слишком сложного и плохо разработанного API.

В BGL нет простых задач, только сложныеи я постоянно боролся с компилятором из-за чрезмерно сложной иерархии шаблонов, которую имеет BGL.Практически нет полезной документации (по крайней мере, там, где это действительно необходимо), и недостаточно примеров только усугубляют ситуацию.Это не способ написать код.

Я бы порекомендовал перейти на LEMON .Он стабилен, написан на C ++, прост для понимания и написания кода, предлагает несколько специализированных форм графиков для поддержки различных потребностей использования, а также поддерживает функции поиска и просмотра BFS и DFS.Он также имеет собственный эквивалент карт свойств для узлов / ребер, поэтому вы должны иметь возможность разместить на нем собственную структуру графа и другие данные.

Попробуйте LEMON;это на вкус намного лучше и вызовет меньше язв.; -)

5 голосов
/ 14 июня 2010

Подход, насколько я понимаю, заключается в том, чтобы специализировать структуру boost::graph_traits для вашего типа графика. Это настраивает BGL с различными важными свойствами, которые он должен знать о вашем графике. Затем вы специализируете глобальные шаблонные функции для специализированного типа вашего графа graph_traits, чтобы реализовать любые интерфейсы графов буста, которые могут применяться к вашему конкретному типу графа.

Пример прямо в документации BGL:

http://www.boost.org/doc/libs/1_43_0/libs/graph/doc/leda_conversion.html

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

http://www.boost.org/doc/libs/1_43_0/libs/graph/doc/graph_concepts.html

...