powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / boost graph library использование
3 сообщений из 3, страница 1 из 1
boost graph library использование
    #39295108
зеленый админ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.

Есть код

Код: 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
boost graph library использование
    #39295256
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зеленый админ,
надо полагать третий параметр не потребуется. Попробуйте
Код: plaintext
1.
  add_edge(i, j);
...
Рейтинг: 0 / 0
boost graph library использование
    #39299116
зеленый админ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там оказалось все сложнее. В моем примере 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
3 сообщений из 3, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / boost graph library использование
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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