write_graphviz не работает, когда список вершин установлен?

Следующий код имеет ошибки:

не может привязать значение ‘std :: basic_ostream ’к d std :: basic_ostream&&

#include <boost/graph/graphviz.hpp>
void foo(int,char*[])
{
using namespace boost;

typedef boost::adjacency_list<
boost::setS, // outedge list
boost::setS, // vertex list
boost::directedS, // undirected
boost::no_property, // vertex prop
boost::no_property, // edge prop
boost::no_property, // graph prop
boost::setS // edgelistc
> Graph;
Graph g;

std::ostringstream dotname;
dotname << "a.dot";
std::ofstream dot(dotname.str());

write_graphviz(dot, g);
}

Работает когда
boost :: vecS, // список вершин

Это ожидается?

2

Решение

Измените селектор вершинного контейнера на setS изменяет дескриптор вершины на тип, который не может быть преобразован.

Вы должны, как и многие другие алгоритмы в BGL, передать отдельный индекс вершины:

В: VertexAndEdgeListGraph& g

Направленный или неориентированный граф. Тип графа должен быть моделью
VertexAndEdgeListGraph, В большинстве случаев график должен иметь внутренний
vertex_index карта недвижимости.

Внешнее сопоставление идентификатора вершины

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

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

int main(int,char*[])
{
using namespace boost;

typedef boost::adjacency_list<setS, setS, directedS> Graph;
Graph g;

std::mt19937 prng{std::random_device{}()};
generate_random_graph(g, 3, 5, prng);

std::map<Graph::vertex_descriptor, size_t> ids;

for (auto u : make_iterator_range(vertices(g)))
ids[u] = ids.size();

default_writer w;

write_graphviz(std::cout, g, w, w, w, make_assoc_property_map(ids));
}

Например, печатные издания

digraph G {
1;
2;
3;
1->2 ;
2->1 ;
2->3 ;
3->1 ;
3->2 ;
}

Внутренняя карта недвижимости:

Вы можете разместить собственность внутри без особых изменений:

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

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

int main(int,char*[])
{
using namespace boost;

typedef boost::adjacency_list<setS, setS, directedS, property<vertex_index_t, size_t> > Graph;
Graph g;

std::mt19937 prng{std::random_device{}()};
generate_random_graph(g, 3, 5, prng);

auto ids = get(vertex_index, g);
size_t num = 0;
for (auto u : make_iterator_range(vertices(g)))
put(ids, u, num++);

write_graphviz(std::cout, g);
}
2

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


По вопросам рекламы [email protected]