2

初心者の質問で申し訳ありませんが、BGLを使い始めようとして髪を引っ張っています。私は深さ優先探索を実験しています:

boost::default_dfs_visitor vis;
boost::depth_first_search( graph, boost::visitor(vis) );

そして、私はカラーマップに関するエラーメッセージの海を受け取っています:

In file included from /usr/include/boost/graph/named_function_params.hpp:22,
                 from /usr/include/boost/graph/depth_first_search.hpp:21,
                 from main.cc:6:
/usr/include/boost/property_map/shared_array_property_map.hpp: In member function 'T& boost::shared_array_property_map<T, IndexMap>::operator[](typename boost::property_traits<IndexMap>::key_type) const [with T = boost::default_color_type, IndexMap = boost::adj_list_vertex_property_map<boost::adjacency_list<boost::vecS, boost::listS, boost::directedS, boost::property<boost::vertex_treegraphnode_t, TreeGraph::node, boost::no_property>, boost::no_property, boost::no_property, boost::listS>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t>]':
/usr/include/boost/property_map/property_map.hpp:324:   instantiated from 'void boost::put(const boost::put_get_helper<Reference, PropertyMap>&, K, const V&) [with PropertyMap = boost::shared_array_property_map<boost::default_color_type, boost::adj_list_vertex_property_map<boost::adjacency_list<boost::vecS, boost::listS, boost::directedS, boost::property<boost::vertex_treegraphnode_t, TreeGraph::node, boost::no_property>, boost::no_property, boost::no_property, boost::listS>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t> >, Reference = boost::default_color_type&, K = void*, V = boost::default_color_type]'
/usr/include/boost/graph/depth_first_search.hpp:196:   instantiated from 'void boost::depth_first_search(const VertexListGraph&, DFSVisitor, ColorMap, typename boost::graph_traits<Graph>::vertex_descriptor) [with VertexListGraph = boost::adjacency_list<boost::vecS, boost::listS, boost::directedS, boost::property<boost::vertex_treegraphnode_t, TreeGraph::node, boost::no_property>, boost::no_property, boost::no_property, boost::listS>, DFSVisitor = boost::dfs_visitor<boost::null_visitor>, ColorMap = boost::shared_array_property_map<boost::default_color_type, boost::adj_list_vertex_property_map<boost::adjacency_list<boost::vecS, boost::listS, boost::directedS, boost::property<boost::vertex_treegraphnode_t, TreeGraph::node, boost::no_property>, boost::no_property, boost::no_property, boost::listS>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t> >]'
/usr/include/boost/graph/depth_first_search.hpp:295:   instantiated from 'void boost::depth_first_search(const VertexListGraph&, const boost::bgl_named_params<P, T, R>&) [with VertexListGraph = TreeGraph::graph_type, P = boost::dfs_visitor<boost::null_visitor>, T = boost::graph_visitor_t, R = boost::no_property]'
main.cc:272:   instantiated from here
/usr/include/boost/property_map/shared_array_property_map.hpp:36: error: no match for 'operator[]' in '((const boost::shared_array_property_map<boost::default_color_type, boost::adj_list_vertex_property_map<boost::adjacency_list<boost::vecS, boost::listS, boost::directedS, boost::property<boost::vertex_treegraphnode_t, TreeGraph::node, boost::no_property>, boost::no_property, boost::no_property, boost::listS>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t> >*)this)->boost::shared_array_property_map<boost::default_color_type, boost::adj_list_vertex_property_map<boost::adjacency_list<boost::vecS, boost::listS, boost::directedS, boost::property<boost::vertex_treegraphnode_t, TreeGraph::node, boost::no_property>, boost::no_property, boost::no_property, boost::listS>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t> >::data[boost::get [with PropertyMap = boost::adj_list_vertex_property_map<boost::adjacency_list<boost::vecS, boost::listS, boost::directedS, boost::property<boost::vertex_treegraphnode_t, TreeGraph::node, boost::no_property>, boost::no_property, boost::no_property, boost::listS>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t>, Reference = const boost::detail::error_property_not_found&, K = void*](((const boost::put_get_helper<const boost::detail::error_property_not_found&, boost::adj_list_vertex_property_map<boost::adjacency_list<boost::vecS, boost::listS, boost::directedS, boost::property<boost::vertex_treegraphnode_t, TreeGraph::node, boost::no_property>, boost::no_property, boost::no_property, boost::listS>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t> >&)((const boost::put_get_helper<const boost::detail::error_property_not_found&, boost::adj_list_vertex_property_map<boost::adjacency_list<boost::vecS, boost::listS, boost::directedS, boost::property<boost::vertex_treegraphnode_t, TreeGraph::node, boost::no_property>, boost::no_property, boost::no_property, boost::listS>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t> >*)(&((const boost::shared_array_property_map<boost::default_color_type, boost::adj_list_vertex_property_map<boost::adjacency_list<boost::vecS, boost::listS, boost::directedS, boost::property<boost::vertex_treegraphnode_t, TreeGraph::node, boost::no_property>, boost::no_property, boost::no_property, boost::listS>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t> >*)this)->boost::shared_array_property_map<boost::default_color_type, boost::adj_list_vertex_property_map<boost::adjacency_list<boost::vecS, boost::listS, boost::directedS, boost::property<boost::vertex_treegraphnode_t, TreeGraph::node, boost::no_property>, boost::no_property, boost::no_property, boost::listS>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t> >::index))), ((void* const&)((void* const*)(& v))))]'
/usr/include/boost/smart_ptr/shared_array.hpp:85: note: candidates are: T& boost::shared_array<T>::operator[](ptrdiff_t) const [with T = boost::default_color_type]

深さ優先探索のドキュメントにはデフォルトがあると記載されており、独自のカラーマップを提供しない例を数多く見たので、なぜ問題があるのか​​わかりません。

私のグラフの種類は次のとおりです。

typedef
  boost::adjacency_list<
  boost::vecS, boost::listS, boost::directedS,
  boost::property<boost::vertex_treegraphnode_t, TreeGraph::node>
  >
  graph_type;

カスタムプロパティマップを持っていたので、depth_first_searchが必要とするカラーマップのデフォルトを上書きする可能性があると思いましたが、次のように追加しました。

boost::property<boost::vertex_color_t, boost::default_color_type>

プロパティリストに、そしてそれも役に立ちませんでした。

深さ優先探索に外部color_mapを使用してみましたが、それも役に立たなかったようです。

私が間違っているかもしれないことについて何か考えはありますか?

ありがとう。

4

1 に答える 1

3
const boost::detail::error_property_not_found&, boost::vertex_index_t

これは「エラーの海」の重要な部分です。テンプレートパラメータとしてadjacency_list持っているものだけがデフォルトの内部プロパティを持ち、このプロパティはデフォルトのカラーマップ(使用している)によって使用されます。いくつかの選択肢があります。vecSVertexListvertex_indexlistS

  • 単純に2番目のパラメーターとして使用できvecSます(グラフをその場で変更する必要がない場合は、これが最も簡単なパラメーターです)。
  • 内部プロパティを作成してから、それを初期化し、グラフで最新の状態に保つようにすることができます。このためには、次のように定義する必要がありますVertexProperty

    boost::property<vertex_index_t, std::size_t, boost::property<boost::vertex_treegraphnode_t, TreeGraph::node>>
    

    その後:

    boost::property_map<graph_type,vertex_index_t>::type my_vertex_index_map=get(vertex_index,graph);
    std::size_t current_index=0;
    BGL_FORALL_VERTICES(v,graph,graph_type)
        put(my_vertex_index_map,v,current_index++);
    
  • 外部プロパティを作成し、初期化して最新の状態に保ちdepth_first_search、名前付きパラメーターを使用してに渡すことができます。

    typedef graph_traits<graph_type>::vertex_descriptor VertexDesc;
    typedef map<VertexDesc, size_t> VertexIndexMap;
    VertexIndexMap mapIndex;
    boost::associative_property_map<VertexIndexMap> my_vertex_index_map(mapIndex);
    std::size_t current_index=0;
    BGL_FORALL_VERTICES(v,graph,graph_type)
        put(my_vertex_index_map,v,current_index++);
    ...
    boost::depth_first_search( graph, boost::visitor(vis).vertex_index_map(my_vertex_index_map);
    
于 2013-03-27T08:11:38.300 に答える