首页 文章

boost图库定向多图edge_range bug

提问于
浏览
3

我有一个带有顶点A..C和边E1..E4的有向多图

A ---E1--> B
A ---E2--> B
A ---E3--> B
B ---E4--> C

我想迭代连接A和B的边缘 .

在BGL中,我将此表达为:

#include <boost/graph/adjacency_list.hpp>

struct Vertex
{
  std::string code;
};

struct Edge
{
  double distance;
  std::string code;
};

int main()
{
  using namespace boost;
  typedef adjacency_list<listS, vecS, directedS, Vertex, Edge> Graph;
  Graph g;
  auto a= add_vertex(Vertex{ "A" }, g);
  auto b= add_vertex(Vertex{ "B" }, g);
  auto c= add_vertex(Vertex{ "C" }, g);
  add_edge(a, b, Edge{ 10, "E1" }, g);
  add_edge(a, b, Edge{ 10, "E2" }, g);
  add_edge(a, b, Edge{ 10, "E3" }, g);
  add_edge(a, c, Edge{ 10, "E4" }, g);

  // checking number of edges
  std::cout<< num_edges(g)<< std::endl;

  // printing edges branching from A
  auto erange= out_edges(a, g);
  for(auto i= erange.first; i!= erange.second; ++ i)
    std::cout<< g[*i].code<< std::endl;

  // now we want to iterate over edges that connect A and B
  auto wtf= boost::edge_range(a, b, g);
}

这导致编译错误:

In file included from /usr/include/boost/graph/adjacency_list.hpp:246:
/usr/include/boost/graph/detail/adjacency_list.hpp:1617:25: error: no matching constructor for initialization of 'StoredEdge' (aka
      'boost::detail::stored_edge_property<unsigned long, Edge>')
        equal_range(el, StoredEdge(v, fake_edge_container.end(),
                    ^          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我已经阅读了文档:

std::pair<out_edge_iterator, out_edge_iterator> edge_range(vertex_descriptor u, vertex_descriptor v, const adjacency_list& g) Returns a pair of out-edge iterators that give the range for all the parallel edges from u to v. This function only works when the OutEdgeList for the adjacency_list is a container that sorts the out edges according to target vertex, and allows for parallel edges. The multisetS selector chooses such a container.

http://www.boost.org/doc/libs/1_54_0/libs/graph/doc/adjacency_list.html

修改了图表:

typedef adjacency_list<multisetS, vecS, directedS, Vertex, Edge> Graph;

但错误没有改变 .

那么如何使用BGL在有向多图中列出两个顶点(from-> to)之间的边?

我发现了一种快速而肮脏的方式:

auto erange= out_edges(a, g);$
for(auto i= erange.first; i!= erange.second; ++ i)$
  std::cout<< g[*i].code<< " -> "<< g[target(*i, g)].code<< std::endl;$

这将让我按目标顶点过滤边缘 . 但是你如何使用 boost::edge_range

1 回答

  • 1

    此错误已在Boost mailinglist之前报告过 .

    当adjacency_list的Directed Selector模板参数设置为directedS时,它无法编译,但如果参数是undirectedS或bidirectionalS,则无法编译 . 下面附有一个说明问题的简短程序 . 问题是edge_range()通过一个带有3个参数的构造函数实例化StoredEdge,但是当Directed Selector被定向时,StoredEdge被typedef到了stored_edge_property,它没有这样的构造函数 . 一种解决方案可能是创建重载的edge_range_dispatch()函数,并在Config :: on_edge_storage上调度 .

    在程序中将 directedS 更改为 undirectedS 可以正常工作 . Live Example . 但这可能不是您的应用程序所需要的,因此您之前提到的简单过滤器可能会更好 . 您可以在Boost邮件列表上重新发布此内容以获得更多关注 .

相关问题