Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / boost graph library использование / 3 сообщений из 3, страница 1 из 1
21.08.2016, 13:11
    #39295108
зеленый админ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
boost graph library использование
Привет всем.

Есть код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#include <string>
#include <boost/graph/adjacency_list.hpp>
//#include <boost/graph/undirected_graph.hpp>
#include <boost/graph/undirected_dfs.hpp>
#include <boost/cstdlib.hpp>
#include <iostream>


typedef adjacency_list<vecS, vecS, undirectedS, no_property, property<edge_color_t, default_color_type>> graph_t;
const std::size_t N = 100500;
graph_t g(N);



Так вот, вместе с ним следующий вызов работает на ура:

Код: plaintext
1.
  add_edge(i, j, g);



Тогда как если имеется следующее объявление:

Код: plaintext
1.
2.
#include <boost/graph/undirected_graph.hpp>
typedef undirected_graph<no_property, property<edge_color_t, default_color_type> > graph_t;



вызов add_edge уже не компилируется (нет подходящего резольвинга для шаблонной ф-ции add_edge). Как правильно добавлять ребро для undirected_graph?
...
Рейтинг: 0 / 0
22.08.2016, 03:52
    #39295256
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
boost graph library использование
зеленый админ,
надо полагать третий параметр не потребуется. Попробуйте
Код: plaintext
1.
  add_edge(i, j);
...
Рейтинг: 0 / 0
28.08.2016, 10:27
    #39299116
зеленый админ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
boost graph library использование
Там оказалось все сложнее. В моем примере i,j - были константы integer. Они должны были резольвиться на vertext_descriptor.
Я порылся по определениям и нарыл следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct adjacency_list_traits
...
    typedef typename detail::is_random_access<VertexListS>::type
      is_rand_access;
...
    typedef std::size_t vertices_size_type;
    typedef void* vertex_ptr;
    typedef typename mpl::if_<is_rand_access,
      vertices_size_type, vertex_ptr>::type vertex_descriptor;



В первом примере vecS (первые два параметра) делает is_rand_access=true_type (т.е. вектор поддерживает random access генераторы). Тогда как для undirected_graph генерирует следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
typedef adjacency_list<listS,
                listS,
                undirectedS,
                internal_vertex_property,
                internal_edge_property,
                GraphProp,
                listS> graph_type;
typedef typename graph_type::vertex_descriptor vertex_descriptor;



и как следствие vertex_descriptor стает void *. И непонятно, что должно быть по-хорошему вместо этих void* при вызове add_edge.

P.S. Я не в восторге от этих 100500 типов в шаблонном программировании. ИМХО, нужно какой-то аналог принципов SOLID и для них распространять. А тут нарушение LSP налицо. Хотя самое смешное, что undirected_graph не замещает общий adjacency_list. Зачем тогда делать общий интерфейс типов, непонятно...
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / boost graph library использование / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]