【问题标题】:write_graphviz does not work when vertex list is setS?设置顶点列表时 write_graphviz 不起作用?
【发布时间】:2015-08-21 15:03:33
【问题描述】:

以下代码有错误:

无法将‘std::basic_ostream’左值绑定到‘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, // 顶点列表

这是预期的吗?

【问题讨论】:

  • 你说你有错误s,暗示有多个错误。请编辑您的问题以包含完整且未经编辑的错误日志。
  • 这里是错误:无法将‘std::basic_ostream’左值绑定到‘std::basic_ostream&&

标签: c++ boost graph graphviz boost-property-map


【解决方案1】:

将顶点容器选择器更改为setS 会将顶点描述符更改为不可流式传输的类型。

与 BGL 中的许多其他算法一样,您应该传递一个单独的顶点索引:

输入:VertexAndEdgeListGraph&amp; g

有向或无向图。图的类型必须是 VertexAndEdgeListGraph。在大多数情况下,图必须具有内部 vertex_index属性图。

外部顶点 ID 映射

Live On Coliru

#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 ;
}

内部属性映射:

您可以将属性放在内部而无需太多更改:

Live On Coliru

#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);
}

【讨论】:

    猜你喜欢
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    相关资源
    最近更新 更多