Я пытаюсь прочитать график из файла Graphviz DOT с помощью библиотеки графиков Boost. как прочитать неизвестное количество свойств, которое хранится в массиве?

int const SIZE=10;
struct DotVertex {
int Attribute[SIZE];
};

struct DotEdge {
std::string label;
};

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS,
DotVertex, DotEdge> graph_t;

int main() {
graph_t graphviz;
boost::dynamic_properties dp(boost::ignore_other_properties);

dp.property("node_id",     boost::get(&DotVertex::name,        graph_t));
dp.property("Attribute0", boost::get(&DotVertex::Attribute[0],  graph_t));
std::ifstream dot("graphnametest2.dot");
boost::read_graphviz(dot,  graph_t, dp);

Как прочитать неизвестные свойства по атрибуту массива [SIZE] из файла Graphviz DOT или даже не знать его размер? Например, следующий код всегда неверен:
dp.property («Attribute0», boost :: get (&DotVertex :: Attribute [0], graph_t))

1

Решение

Вы можете использовать любую карту недвижимости. Но вам нужен действительный.

Все ваши карты недвижимости недействительны. В основном потому что graph_t называет тип (используйте graphviz?).

Последний, потому что нет члена Attribute[0], Есть только Attribute, который является массивом. Поэтому, чтобы использовать его вообще, нужно добавить преобразование. Смотрите также

DEMO

Жить на Колиру

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>

int const SIZE=10;

struct DotVertex {
std::string name;
int Attribute[SIZE];
};

struct DotEdge {
std::string label;
};

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, DotVertex, DotEdge> graph_t;

#include <boost/phoenix.hpp>
using boost::phoenix::arg_names::arg1;

int main() {
graph_t graphviz;
boost::dynamic_properties dp(boost::ignore_other_properties);

dp.property("node_id", boost::get(&DotVertex::name, graphviz));
dp.property("label",   boost::get(&DotEdge::label,  graphviz));

auto attr_map = boost::get(&DotVertex::Attribute, graphviz);

for (int i = 0; i<SIZE; ++i)
dp.property("Attribute" + std::to_string(i),
boost::make_transform_value_property_map(arg1[i], attr_map));

std::ifstream dot("graphnametest2.dot");
boost::read_graphviz(dot, graphviz, dp);
}
2

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

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

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