简体   繁体   English

在Boost反向图中的边缘上迭代

[英]iterating over edges in boost reverse graph

I am unable to iterate over the list of edges in a reversed adjacency list graph. 我无法遍历反向邻接列表图中的边列表。 Minimal code sample listed below with corresponding clang 6/gcc 7.3 error messages. 下面列出的最小代码示例以及相应的clang 6 / gcc 7.3错误消息。 Any help will be greatly appreciated!!! 任何帮助将不胜感激!!!

#include <boost/config.hpp>
#include <algorithm>
#include <vector>
#include <utility>
#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/reverse_graph.hpp>
#include <boost/graph/graph_utility.hpp>

using namespace boost;
struct vertexinfo {
    int index{12};
};

struct edgeinfo {
    int index{10};
};

using Graph = adjacency_list < vecS, vecS, bidirectionalS ,vertexinfo,edgeinfo>;
using ReversedGraph = reverse_graph<Graph>;

int main(){
    Graph graph(5);
    auto e1 = add_edge(0, 2, graph);
    graph[e1.first].index = 1;
    auto e2 = add_edge(1, 1, graph);
    graph[e2.first].index = 2;
    auto e3 = add_edge(1, 3, graph);
    graph[e3.first].index = 3;
    auto e4 = add_edge(1, 4, graph);
    graph[e4.first].index = 4;
    auto e5 = add_edge(2, 1, graph);
    graph[e5.first].index = 5;
    auto e6 = add_edge(2, 3, graph);
    graph[e6.first].index = 6;
    auto e7 = add_edge(2, 4, graph);
    graph[e7.first].index = 7;
    auto e8 = add_edge(3, 1, graph);
    graph[e8.first].index = 8;
    auto e9 = add_edge(3, 4, graph);
    graph[e9.first].index = 9;
    auto e10 = add_edge(4, 0, graph);
    graph[e10.first].index = 10;
    auto e11 = add_edge(4, 1, graph);
    graph[e11.first].index = 11;

    ReversedGraph reversed_graph(graph);

    std::cout << "original graph:" << std::endl;
    print_graph(graph, get(vertex_index, graph));

    std::cout << std::endl << "reversed graph:" << std::endl;
    print_graph(reversed_graph, get(vertex_index, graph));

    auto range = edges(reversed_graph);
    std::for_each(range.first,range.second,[&](const auto& item){
      std::cout << reversed_graph[item].index << '\n';
    });
    return EXIT_SUCCESS;
}

error message In file included from 错误消息包含在文件中

prog.cc:9: /opt/wandbox/boost-1.67.0/clang-6.0.0/include/boost/graph/reverse_graph.hpp:149:14: error: binding value of type 'const boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, vertexinfo, edgeinfo, boost::no_property, boost::listS>::edge_bundled' (aka 'const edgeinfo') to reference to type 'typename graph::detail::bundled_result<adjacency_list<vecS, vecS, bidirectionalS, vertexinfo, edgeinfo, no_property, listS>, typename detail::get_underlying_descriptor_from_reverse_descriptor<reverse_graph_edge_descriptor<edge_desc_impl<bidirectional_tag, unsigned long> > >::type>::type' (aka 'edgeinfo') drops 'const' qualifier
    { return m_g[detail::get_underlying_descriptor_from_reverse_descriptor<Descriptor>::convert(x)]; }
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ prog.cc:61:22: note: in instantiation of function template specialization 'boost::reverse_graph<boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, vertexinfo, edgeinfo, boost::no_property, boost::listS>, const boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, vertexinfo, edgeinfo, boost::no_property, boost::listS> &>::operator[]<boost::detail::reverse_graph_edge_descriptor<boost::detail::edge_desc_impl<boost::bidirectional_tag, unsigned long> > >' requested here
        std::cout << reversed_graph[item].index << '\n';
                     ^ prog.cc:60:10: note: in instantiation of function template specialization 'std::__1::for_each<boost::iterators::transform_iterator<boost::detail::reverse_graph_edge_descriptor_maker<boost::detail::edge_desc_impl<boost::bidirectional_tag, unsigned long> >, boost::detail::undirected_edge_iter<std::__1::__list_iterator<boost::list_edge<unsigned long, edgeinfo>, void *>, boost::detail::edge_desc_impl<boost::bidirectional_tag, unsigned long>, long>, boost::iterators::use_default, boost::iterators::use_default>, (lambda at prog.cc:60:44)>' requested here
    std::for_each(range.first,range.second,[&](const auto& item){

From Boost Graph documentation the constructor for the reverse graph adaptor (reverse_graph ) defaults to a const BidirectionalGraph& for the GraphReference parameter. 从Boost Graph文档中,反向图形适配器(reverse_graph)的构造函数默认为GraphReference参数的const BidirectionalGraph&。 I had to change that to BidirectionalGraph& for the code to successfully compile!! 我必须将其更改为BidirectionalGraph&才能成功编译代码!

//using ReversedGraph = reverse_graph<Graph>;
using ReversedGraph = reverse_graph<Graph,Graph&>;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM